xkcd-style password generator
$ xpg -h
xpg 0.18.0 <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,
upper-snake, screaming-snake, kebab, cobol,
upper-kebab, train, flat, upper-flat, alternating,
random, pseudo-random]
-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.0
See also the Configuration section below.
$ xpg
fireanimalwithchoose
$ xpg -c 10
blueradiobulgariaabout
angerkillpushedlevel
steelhairseasonsaid
experiencehandsignalmolecules
strongswimshadepartial
gamefamilyinstrumentsseen
sightstrangelookbarbados
faceflowerlatershine
grouppagequicklyfree
tiedoctobermightexcept
or until Ctrl+C / SIGINT
$ xpg -c 0
hersdivisionconsiderjupiter
filledcapitalminddoes
angerfenceofferdeath
alongperusentweather
fastwantsburningstart
figuresoonshoesinterest
niecebeganoutsidenumber
februarydatesuggestedwednesday
pagesettledvowelfamily
maltabeatbankerfish
^C
$ xpg wwwwwwww
boardtailcostcopenhagenseedeverysufferbase
$ xpg wwwwwwww -c 10
pickedfinetakenblockshorttexasworthspell
gathertonebridgeequalpartyrolleddistantbusiness
createheartfifthburningstrongseveraldelighthour
fancylastrestdetailsangryfingershalfberlin
egyptfinallymexicobrightspokeobservedecimalbottom
walkwriteeuropegraylandspainsandperiod
takecaptaintalleverythingroomlargeunderlate
resultrepresentlittlefiftypeoplepaintwhomcover
catchefforteastsaidjupiterhillclothesrule
insectsvirginiaaprilsaturdaytownpagebusinesstell
$ xpg wwddd
shallbuilt755
$ xpg wwss
whichpresident<[
$ xpg wwds
nepalpluto3*
$ xpg wwwwcc
clearshineyourtradeti
$ xpg wwwwCC
mightwheathealthfollowNS
$ xpg TTTT
TravelWheelsExplainShake
$ xpg WWWW
MAILFRIENDSBARBADOSMELODY
An "any" character can be a lowercase letter, uppercase letter, digit, or symbol.
$ xpg wwwwaaaaa
attemptagreeschoolround(<;?_
$ xpg www -m 15
fingersmondaydoes
$ xpg www -M 20
needlefoolball
$ xpg www -m 20 -M 25 -a 1000
determineshoutbelong
See also Usage note 2.
$ xpg wwddds -l 16 -a 1000
articlesmell362+
See also Usage note 2.
$ xpg '1TT!'
1InstrumentsHeat!
$ xpg 's{adj}{adj}{n}dd'
-characterfrontanger09
$ xpg 'ww{ext}'
sectionmembershelike
$ xpg 'ww{T:ext}'
thousandmontanaNaiad
$ xpg 'ww{W:ext}'
venusmomentDIONYSUS
$ xpg -ec 10 TTTT
TallHeatPoundsBack
MeetingDecemberSingaporeBottom
PaperMannerThousandStation
AgainstNereidThinkYard
GroundNeedFastSaid
AfricaSomeWirePosition
ThickLakeChileShould
PleasantFoolDamascusSpoke
PlantsGardenSameParticular
FiftyRoundSouthcarolinaGround
$ xpg keychain
o2mydp-bwrulo-dUwclm
$ xpg codename
LONG EQUATION
$ xpg codename-series
COOLTUESDAY ADVANCEHUNGER
COOLTUESDAY MOSTCOAT
COOLTUESDAY SILENTTEAM
COOLTUESDAY WIDETHIRD
COOLTUESDAY NICESCORE
COOLTUESDAY SEPARATEBREAD
COOLTUESDAY BUILTBRANCH
COOLTUESDAY GREEKBASKET
COOLTUESDAY MIDDLEMETAL
COOLTUESDAY STRAIGHTUNIT
$ xpg codename-series -c 20
WORTHCENTER SAMECONTROL
WORTHCENTER USUALDEAR
WORTHCENTER BEATPATTERN
WORTHCENTER NICEWHEEL
WORTHCENTER PROUDQUIET
WORTHCENTER FUTURETOWN
WORTHCENTER NOTHINGCHILDREN
WORTHCENTER DEVELOPEDHUNT
WORTHCENTER ACTIONNOTHING
WORTHCENTER PROBABLYSURFACE
WORTHCENTER CHARACTERVALLEY
WORTHCENTER SEPARATELAUGHTER
WORTHCENTER LONEELECTRICITY
WORTHCENTER BESTWAVES
WORTHCENTER MAINATTEMPT
WORTHCENTER PURESUFFIX
WORTHCENTER LEVELMEETING
WORTHCENTER FULLLAND
WORTHCENTER STRONGTAKE
WORTHCENTER EIGHTCALL
$ xpg haiku
Iron future give / Division Botswana bone / Rather Germany
$ xpg haiku+
Addition where huge (3,1,1) / River rain fight Gibraltar (2,1,1,3) / Alaska wing have (3,1,1)
$ xpg haiku-
Week-also-delight(1,2,2)/Jerusalem-passed-hunting(4,1,2)/Needle-process-hill(2,2,1)
$ xpg haiku--
Considerable/Steel-minute-whose-themselves-think/Electricity
$ xpg haiku++
California spent
Spring land considerable
Orderly Peru
$ xpg haiku+++
Electricity (5)
Energy direct doubt wore (3,2,1,1)
Information ball (4,1)
$ xpg -e haiku
Colombia hang / Paris various none terms / Opinion once near
$ xpg aaaaaaaaaaaaaaaaaaaa
bqE~FW}T.(~[Pum{NHhO
This works because a character-only pattern is padded to the minimum length with the last character.
$ xpg a -m 20
NtPoEQ5]{}[nA;E*m8F8
$ xpg cccccCds
etxapA6!
$ xpg -s cccccCds
ij7t@toH
This works because a character-only pattern is padded to the minimum length with the last character.
$ xpg -sm 8 Cdsc
iliy?8lP
$ xpg wwww WWWW TTTT
heardraisedgoodstep
FORMCHARACTERPLANEHOLD
SoftWesternWomenReal
$ xpg -A upper 'T T T T'
WORN FENCE SAID LEAD
$ xpg -A lower 'T T T T'
happen express know consider
$ xpg -A title 'T T T T'
Peace From Though Like
$ xpg -A toggle 'T T T T'
uNIT pIECE tHREE hERE
$ xpg -A camel 'T T T T'
floridaWheatBlueListen
$ xpg -A pascal 'T T T T'
PositionCompleteBerlinLanguage
$ xpg -A upper-camel 'T T T T'
CoolAlsoSufferDamascus
$ xpg -A snake 'T T T T'
sing_november_inside_join
$ xpg -A upper-snake 'T T T T'
WHOLE_EXPLAIN_STUDENTS_GOLD
$ xpg -A screaming-snake 'T T T T'
QUITE_DOCTOR_GOES_FAVOR
$ xpg -A kebab 'T T T T'
work-something-include-design
$ xpg -A cobol 'T T T T'
AROUND-SENT-SUDDEN-THEM
$ xpg -A upper-kebab 'T T T T'
FRENCH-NECK-BEAUTIFUL-GOODBYE
$ xpg -A train 'T T T T'
Read-Govern-Country-Gibraltar
$ xpg -A flat 'T T T T'
cityotherforwarddifference
$ xpg -A upper-flat 'T T T T'
PLUTOHELPLEASTJERUSALEM
$ xpg -A alternating 'T T T T'
lIvE fInAlLy SoMeTiMeS fIfTy
$ xpg -A random 'T T T T'
hEaVen EneRgY hERS ReMAiN
$ xpg -A pseudo-random 'T T T T'
LiaR ThrEE veNuS rOcK
$ xpg '{a:1}-{W:a:2}-{T:a:3}-{olympian:4}-{T:ext:5}'
drop-CHILE-Triangle-dionysus-Southamerica
$ 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
characters
object value must contain theC
,c
, andd
keys 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}
(replacesub
with an actual{sub}
name above). -
{sub}
s include all words by default, but if suffixed with:N
whereN
is a number, it will only include words with that number of syllables: i.e.{sub:N}
(replacesub
with an actual{sub}
name above andN
with 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