AXLR / Catalog / personal

wordle_helper

Wordle helper: score a guess against an answer with the game's rule for repeated letters, filter a word list by the green/yellow/grey feedback of earlier guesses, and rank the next guesses by expected information (entropy of the feedback pattern) or letter frequency. Uses the word list given or a bundled list of five-letter words from SCOWL (permissive ESDB licence).

Install

/tools install wordle_helper
/tools install wordle_helper@1.0.0

In a console session, or let the model find it in normal mode: axlr_catalog describes it and axlr_install_tool asks for the same install card. The card reads catalog axlr · wordle_helper 1.0.0 · verified once the index signature, the manifest digest and every file digest check out. Then the model runs it with axlr_run_tool wordle_helper; each run is approved as a local_exec.

Arguments

One JSON object on stdin, validated against the schema before the program starts.

nametyperequireddefaultmeaning
guessesarray of objectnoitems ≤ 20
wordsarray of stringnoAllowed words, all the same length (default: bundled five-letter list). items ≤ 50000
rankstringno"entropy"one of "entropy", "frequency"
topintegerno10≥ 1; ≤ 100
hard_modebooleannofalseSuggest only words that could still be the answer
scoreobjectnoOnly compute the feedback of one guess
Input schema (JSON)
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "guesses": {
      "type": "array",
      "maxItems": 20,
      "items": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "guess",
          "feedback"
        ],
        "properties": {
          "guess": {
            "type": "string"
          },
          "feedback": {
            "type": "string",
            "description": "g/y/. per letter (also 2/1/0 or the coloured squares)"
          }
        }
      }
    },
    "words": {
      "type": "array",
      "maxItems": 50000,
      "items": {
        "type": "string"
      },
      "description": "Allowed words, all the same length (default: bundled five-letter list)"
    },
    "rank": {
      "type": "string",
      "enum": [
        "entropy",
        "frequency"
      ],
      "default": "entropy"
    },
    "top": {
      "type": "integer",
      "minimum": 1,
      "maximum": 100,
      "default": 10
    },
    "hard_mode": {
      "type": "boolean",
      "default": false,
      "description": "Suggest only words that could still be the answer"
    },
    "score": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "guess",
        "answer"
      ],
      "properties": {
        "guess": {
          "type": "string"
        },
        "answer": {
          "type": "string"
        }
      },
      "description": "Only compute the feedback of one guess"
    }
  }
}

Example

Input

{
  "words": [
    "abide",
    "aside",
    "snide",
    "tilde",
    "bride",
    "oxide"
  ],
  "guesses": [
    {
      "guess": "speed",
      "feedback": "..y.y"
    }
  ],
  "top": 2
}

Output (stdout)

{
  "candidates_count": 4,
  "candidates": [
    "abide",
    "bride",
    "oxide",
    "tilde"
  ],
  "suggestions": [
    {
      "word": "abide",
      "entropy_bits": 2.0,
      "expected_remaining": 1.0,
      "patterns": 4,
      "possible_answer": true
    },
    {
      "word": "bride",
      "entropy_bits": 2.0,
      "expected_remaining": 1.0,
      "patterns": 4,
      "possible_answer": true
    }
  ]
}

Files

The command the install card registers is python3 wordle_helper.py, run in the workspace with PATH and HOME as its only environment. Each file's SHA-256 is in the signed index; the console checks them before showing the card and again before writing.

wordle_helper.py · sha256 0322ba3f2aaf059f39fd27f71a57c299082fef4599a53cbffad83c0b2a417c0f
#!/usr/bin/env python3
"""Wordle helper: score a guess against an answer with the game's rules for repeated letters,
filter a word list by the feedback of earlier guesses, and rank the remaining candidates by letter
frequency or by expected information (entropy of the feedback pattern).

Input (JSON on stdin):
  guesses   [{"guess": "crane", "feedback": "..y.g"}, ...]   feedback per letter:
            g / G / 2 / 🟩 green (right letter, right place); y / Y / 1 / 🟨 yellow (in the word,
            elsewhere); . / b / x / - / 0 / ⬛ / ⬜ grey (not in the word, or no more copies of it)
  words     list of allowed words (default: the bundled words5.txt, five-letter words from SCOWL)
  rank      "entropy" | "frequency" (default entropy)
  top       how many suggestions (default 10, at most 100)
  hard_mode true: suggest only words that are still possible answers (default false for entropy)
  score     {"guess": "speed", "answer": "abide"}: only compute the feedback of one guess
"""
import json
import math
import sys
from collections import Counter

GREEN, YELLOW, GREY = "g", "y", "."
CODES = {"g": GREEN, "2": GREEN, "🟩": GREEN, "y": YELLOW, "1": YELLOW, "🟨": YELLOW,
         ".": GREY, "b": GREY, "x": GREY, "-": GREY, "0": GREY, "⬛": GREY, "⬜": GREY, "_": GREY}
WORK_LIMIT = 400000


def fail(message):
    print(json.dumps({"error": message}))
    sys.exit(2)


def feedback(guess, answer):
    """Two passes, as in the game: greens first, then yellows from the answer's remaining letters
    left to right; extra copies of a letter are grey."""
    result = [GREY] * len(guess)
    remaining = Counter()
    for i, (g, a) in enumerate(zip(guess, answer)):
        if g == a:
            result[i] = GREEN
        else:
            remaining[a] += 1
    for i, g in enumerate(guess):
        if result[i] != GREEN and remaining[g] > 0:
            result[i] = YELLOW
            remaining[g] -= 1
    return "".join(result)


def parse_feedback(text, length, field):
    if not isinstance(text, str):
        fail(f"{field} must be a string such as \"..y.g\"")
    out = []
    for ch in text.replace("️", "").replace(" ", ""):
        code = CODES.get(ch.lower() if ch.isascii() else ch)
        if code is None:
            fail(f"{field}: {ch!r} is not g, y or . (or 2/1/0, or the coloured squares)")
        out.append(code)
    if len(out) != length:
        fail(f"{field} has {len(out)} marks for a {length}-letter guess")
    return "".join(out)


def word(text, field):
    if not isinstance(text, str) or not text.strip().isalpha() or not text.strip().isascii():
        fail(f"{field} must be a word of letters a-z")
    return text.strip().lower()


def load_bundled():
    try:
        with open("words5.txt", encoding="utf-8") as handle:
            return [line.strip() for line in handle if line.strip() and not line.startswith("#")]
    except OSError as error:
        fail(f"cannot read the bundled words5.txt: {error}")


def main():
    try:
        request = json.load(sys.stdin)
    except ValueError as error:
        fail(f"stdin is not JSON: {error}")
    if not isinstance(request, dict):
        fail("input must be a JSON object")
    extra = set(request) - {"guesses", "words", "rank", "top", "hard_mode", "score"}
    if extra:
        fail(f"unknown fields: {sorted(extra)}")
    if "score" in request:
        s = request["score"]
        if not isinstance(s, dict) or set(s) != {"guess", "answer"}:
            fail("score must be {\"guess\": ..., \"answer\": ...}")
        g, a = word(s["guess"], "score.guess"), word(s["answer"], "score.answer")
        if len(g) != len(a):
            fail("score: guess and answer must have the same length")
        fb = feedback(g, a)
        print(json.dumps({"guess": g, "answer": a, "feedback": fb,
                          "squares": fb.replace(GREEN, "🟩").replace(YELLOW, "🟨").replace(GREY, "⬛"),
                          "letters": [{"letter": c, "mark": {"g": "green", "y": "yellow", ".": "grey"}[m]} for c, m in zip(g, fb)]},
                         ensure_ascii=False))
        return
    if "words" in request:
        raw = request["words"]
        if not isinstance(raw, list) or not raw or len(raw) > 50000:
            fail("words must be a list of 1 to 50000 words")
        words = [word(w, f"words[{i}]") for i, w in enumerate(raw)]
        source = "words given in the input"
    else:
        words = load_bundled()
        source = "bundled words5.txt (SCOWL/ESDB size 35, five-letter words; not the official Wordle list)"
    lengths = {len(w) for w in words}
    if len(lengths) != 1:
        fail("all words must have the same length")
    length = lengths.pop()
    words = sorted(set(words))
    guesses = request.get("guesses", [])
    if not isinstance(guesses, list) or len(guesses) > 20:
        fail("guesses must be a list of at most 20 guesses")
    constraints = []
    for i, item in enumerate(guesses):
        if not isinstance(item, dict) or set(item) != {"guess", "feedback"}:
            fail(f"guesses[{i}] must be {{\"guess\": ..., \"feedback\": ...}}")
        g = word(item["guess"], f"guesses[{i}].guess")
        if len(g) != length:
            fail(f"guesses[{i}].guess has {len(g)} letters; the words have {length}")
        constraints.append((g, parse_feedback(item["feedback"], length, f"guesses[{i}].feedback")))
    candidates = [w for w in words if all(feedback(g, w) == fb for g, fb in constraints)]
    rank = request.get("rank", "entropy")
    if rank not in ("entropy", "frequency"):
        fail("rank must be entropy or frequency")
    top = request.get("top", 10)
    if isinstance(top, bool) or not isinstance(top, int) or not 1 <= top <= 100:
        fail("top must be an integer from 1 to 100")
    hard = request.get("hard_mode", False)
    if not isinstance(hard, bool):
        fail("hard_mode must be a boolean")

    result = {"word_list": source, "word_count": len(words), "length": length, "candidates_count": len(candidates)}
    if len(candidates) <= 50:
        result["candidates"] = candidates
    if not candidates:
        result["note"] = "no word in the list fits all the feedback: check the marks, or the answer is not in the list"
        result["suggestions"] = []
        print(json.dumps(result, ensure_ascii=False))
        return
    # letter frequency among the candidates (each letter counted once per word)
    freq = Counter()
    for w in candidates:
        freq.update(set(w))
    pos = [Counter(w[i] for w in candidates) for i in range(length)]
    freq_score = lambda w: sum(freq[c] for c in set(w)) + sum(pos[i][c] for i, c in enumerate(w)) / (len(candidates) + 1)
    result["letter_frequency"] = {c: n for c, n in sorted(freq.items(), key=lambda kv: (-kv[1], kv[0]))}
    candidate_set = set(candidates)
    if rank == "frequency" or len(candidates) <= 2:
        ordered = sorted(candidates, key=lambda w: (-freq_score(w), w))[:top]
        result["rank"] = "frequency" if rank == "frequency" else "entropy (two or fewer candidates: guess one)"
        result["suggestions"] = [{"word": w, "score": sum(freq[c] for c in set(w)), "possible_answer": True} for w in ordered]
    else:
        pool = candidates if hard else words
        n = len(candidates)
        budget = max(top, WORK_LIMIT // n)
        if len(pool) > budget:
            pool = sorted(pool, key=lambda w: (-freq_score(w), w))[:budget]
            result["guesses_evaluated"] = f"{budget} best by letter frequency (of {len(candidates) if hard else len(words)})"
        scored = []
        for g in pool:
            buckets = Counter(feedback(g, w) for w in candidates)
            entropy = -sum(c / n * math.log2(c / n) for c in buckets.values())
            expected = sum(c * c for c in buckets.values()) / n
            scored.append((-round(entropy, 12), g not in candidate_set, g, entropy, expected, len(buckets)))
        scored.sort()
        result["rank"] = "entropy" + (" (hard mode: possible answers only)" if hard else "")
        result["max_entropy_bits"] = round(math.log2(n), 4)
        result["suggestions"] = [{"word": g, "entropy_bits": round(e, 4), "expected_remaining": round(x, 3), "patterns": p,
                                  "possible_answer": g in candidate_set} for _, _, g, e, x, p in scored[:top]]
    print(json.dumps(result, ensure_ascii=False))


if __name__ == "__main__":
    main()
words5.txt · sha256 444d271327493fb37ba8a1771f6eaecae31f498f3a5010e61607ba629b7c397a
# Five-letter English words for wordle_helper, generated by tools/catalog/data/wordle_helper.py
# from https://app.aspell.net/create?max_size=35&spelling=US&max_variant=0&diacritic=strip&download=wordlist&encoding=utf-8&format=inline
# fetched 2026-10-18; filter: lowercase a-z only, exactly 5 letters; 3438 words
# Not the official Wordle list. The notice of the source follows, as its licence requires.
#
# Custom wordlist generated from https://app.aspell.net/create using
# the English Speller Database (ESDB) with parameters:
#   Size: 35 (small)
#   Spelling: US
#   Variant Level: 1 *default*
#   Special: <none>
#   Diacritics: strip
#
# https://wordlist.aspell.net
#
# ESDB Git Revision: Wed Jun 24 14:30:42 2026 -0400 [1e5b7d3]
# App Git Revision: Thu Jun 25 15:43:51 2026 -0400 [156fb4e]
#
# Copyright 2000-2026 by Kevin Atkinson
#
# Permission to use, copy, modify, distribute, and sell any part of the English
# Speller Database (ESDB, previously known as SCOWLv2), or word lists
# created from it, is hereby granted without fee, provided that the above
# copyright notice appears in all copies and that both the above copyright
# notice and this notice appear in supporting documentation.  Kevin Atkinson
# makes no representations about the suitability of this database for any
# purpose.  It is provided "as is" without express or implied warranty.
#
# ESDB is derived from many sources, most of which are in the Public Domain.
# Data from the Corpus of Contemporary American English (COCA) was also used.
#
# All data from COCA comes from 3-gram data that is not freely available;
# however, the usage is within the rights given by the NDA that was signed when
# purchasing the data.  More information on COCA is available at
# https://www.english-corpora.org/coca/.
#
# The primary source of words for ESDB comes from 12dicts and ENABLE2K.  Both
# are in the Public Domain, but Alan Beale <biljir@pobox.com> deserves special
# credit as he is the author of 12dicts and a major contributor to ENABLE2K.  In
# addition, he gave me an incredible amount of feedback and created a number of
# special lists in order to help improve the overall quality of ESDB.
aback
abate
abbey
abbot
abets
abhor
abide
abler
abode
abort
about
above
abuse
abyss
ached
aches
acids
acing
acorn
acres
acrid
acted
actor
acute
adage
adapt
added
adept
admit
adobe
adopt
adore
adorn
adult
affix
afoot
after
again
agent
agile
aging
aglow
agony
agree
ahead
aided
aides
ailed
aimed
aired
aisle
alarm
album
alert
algae
alias
alibi
alien
align
alike
alive
allay
alley
allot
allow
alloy
aloft
alone
along
aloof
aloud
alpha
altar
alter
altos
amass
amaze
amber
amble
amend
amiss
among
ample
amply
amuse
angel
anger
angle
angry
angst
ankle
annex
annoy
annul
anvil
aorta
apart
aping
apple
apply
apron
apter
aptly
arbor
arced
ardor
areas
arena
argue
arias
arise
armed
armor
aroma
arose
array
arrow
arson
ashen
ashes
aside
asked
askew
aspen
asses
asset
atlas
atoms
atone
attic
audio
audit
aunts
aural
auras
autos
avail
avert
avoid
avows
await
awake
award
aware
awful
awing
awoke
axing
axiom
axles
azure
babes
backs
bacon
badge
badly
bagel
baggy
bails
baits
baked
baker
bakes
balds
baled
bales
balks
balls
balms
balmy
banal
bands
bandy
bangs
banjo
banks
barbs
bards
bared
barer
bares
barge
barks
barns
baron
based
baser
bases
basic
basil
basin
basis
basks
baste
batch
bathe
baths
baton
bawdy
bawls
bayed
bayou
beach
beads
beady
beaks
beams
beans
beard
bears
beast
beats
beech
beefs
beefy
beers
beets
befit
began
begin
begun
beige
being
belch
belie
bells
belly
below
belts
bench
bends
bents
beret
berry
berth
beset
bests
bible
bides
bigot
biked
bikes
bills
binds
bingo
biped
birch
birds
birth
bison
bitch
bites
blabs
black
blade
blame
bland
blank
blare
blase
blast
blaze
bleak
bleat
bleed
blend
bless
blimp
blind
blink
blips
bliss
blitz
blobs
block
blocs
blogs
blond
blood
bloom
blots
blown
blows
blued
bluer
blues
bluff
blunt
blurb
blurs
blurt
blush
board
boars
boast
boats
boded
bodes
bogus
boils
bolts
bombs
bonds
boned
bones
bonus
booby
booed
books
booms
boons
boors
boost
booth
boots
booty
booze
bored
bores
borne
bosom
bossy
botch
bough
bound
bouts
bowed
bowel
bowls
boxed
boxer
boxes
brace
brags
braid
brain
brake
brand
brash
brass
brats
brave
bravo
brawl
brawn
brays
bread
break
breed
brews
bribe
brick
bride
brief
brims
brine
bring
brink
briny
brisk
broad
broil
broke
brood
brook
broom
broth
brown
brows
brunt
brush
brute
bucks
buddy
budge
buffs
buggy
bugle
build
built
bulbs
bulge
bulks
bulky
bulls
bully
bumps
bumpy
bunch
bunks
bunny
buoys
burly
burns
burnt
burps
burro
burrs
burst
bused
buses
bushy
busts
butte
butts
buxom
buyer
bytes
byway
cabin
cable
cacao
cache
cacti
cadet
cafes
caged
cages
cagey
caked
cakes
calks
calls
calms
camel
cameo
camps
canal
candy
caned
canes
canny
canoe
canon
caped
caper
capes
carat
cards
cared
cares
cargo
carol
carps
carry
carts
carve
cased
cases
casks
caste
casts
catch
cater
caulk
cause
caved
caves
cawed
cease
cedar
ceded
cedes
cello
cells
cents
chafe
chaff
chain
chair
chalk
champ
chant
chaos
chaps
charm
chars
chart
chase
chasm
chats
cheap
cheat
check
cheek
cheep
cheer
chefs
chess
chest
chews
chewy
chick
chide
chief
child
chili
chill
chime
chimp
china
chink
chins
chips
chirp
choir
choke
chops
chord
chore
chose
chows
chuck
chugs
chums
chunk
churn
chute
cider
cigar
cinch
circa
cited
cites
civic
civil
clack
claim
clamp
clams
clang
clank
clans
claps
clash
clasp
class
claws
clean
clear
cleat
clefs
cleft
clerk
click
cliff
climb
cling
clink
clips
cloak
clock
clods
clogs
clone
close
cloth
clots
cloud
clout
clove
clown
clubs
cluck
clued
clues
clump
clung
coach
coals
coast
coats
cobra
cocks
cocky
cocoa
coded
codes
coils
coins
coked
cokes
colds
colic
colon
color
colts
comas
combs
comes
comet
comic
comma
cones
cooed
cooks
cools
coops
coped
copes
coral
cords
cored
cores
corks
corns
corny
corps
costs
couch
cough
could
count
coups
court
cover
coves
covet
cowed
cower
coyer
crabs
crack
craft
crags
cramp
crams
crane
crank
crash
crass
crate
crave
crawl
craze
crazy
creak
cream
creed
creek
creep
crepe
crept
crest
crews
cribs
cried
cries
crime
crisp
croak
crock
crony
crook
croon
crops
cross
crowd
crown
crows
crude
cruel
crumb
crush
crust
crypt
cubed
cubes
cubic
cuffs
cuing
culls
cults
curbs
curds
cured
cures
curio
curls
curly
curry
curse
curve
cuter
cycle
cynic
cysts
czars
daddy
daily
dairy
daisy
dally
dames
damns
damps
dance
dandy
dared
dares
darns
darts
dated
dates
datum
daubs
daunt
dawns
dazed
dazes
deals
dealt
deans
dears
death
debit
debts
debug
debut
decay
decks
decoy
decry
deeds
deems
deeps
defer
deify
deign
deity
delay
delis
delta
delve
demon
denim
dense
dents
depot
depth
desks
deter
devil
dials
diary
diced
dices
diets
digit
diked
dikes
dills
dimes
dimly
dined
diner
dines
dingy
direr
dirge
dirty
disco
discs
disks
ditch
ditto
ditty
divas
dived
diver
dives
dizzy
docks
dodge
doers
dogma
doily
doing
doled
doles
dolls
dolly
domed
domes
donor
donut
dooms
doors
doped
dopes
dopey
dosed
doses
doted
dotes
doubt
dough
douse
doves
dowdy
downs
downy
dowry
dozed
dozen
dozes
drabs
draft
drags
drain
drama
drank
drape
drawl
drawn
draws
dread
dream
dregs
dress
dried
drier
dries
drift
drill
drink
drips
drive
droll
drone
drool
droop
drops
dross
drove
drown
drugs
drums
drunk
dryer
dryly
ducks
ducts
duded
dudes
duels
duets
dukes
dulls
dully
dummy
dumps
dumpy
dunce
dunes
dungs
dunks
dunno
duped
dupes
dusky
dusts
dusty
duvet
dwarf
dwell
dwelt
dying
dykes
eager
eagle
earls
early
earns
earth
eased
easel
eases
eaten
eater
eaves
ebbed
ebony
edged
edges
edict
edits
eerie
egged
eight
eject
eking
elbow
elder
elect
elegy
elite
elope
elude
elves
email
embed
ember
emirs
emits
empty
enact
ended
endow
enema
enemy
enjoy
ensue
enter
entry
envoy
epics
epoch
equal
equip
erase
erect
erode
erred
error
erupt
essay
ether
ethic
ethos
evade
evens
event
every
evict
evils
evoke
exact
exalt
exams
excel
exert
exile
exist
exits
expel
extol
extra
exude
exult
fable
faced
faces
facet
facts
faded
fades
fagot
fails
faint
fairs
fairy
faith
faked
fakes
falls
false
famed
fancy
fangs
farce
fared
fares
farms
fasts
fatal
fated
fates
fatty
fault
fauna
favor
fawns
fazed
fazes
fears
feast
feats
feces
feeds
feels
feign
feint
fells
felon
felts
fence
fends
ferns
ferry
fetal
fetch
feted
fetes
fetid
fetus
feuds
fever
fewer
fiber
fiche
field
fiend
fiery
fifth
fifty
fight
filch
filed
files
fills
filly
films
filmy
filth
final
finch
finds
fined
finer
fines
fired
fires
firms
first
fishy
fists
fiver
fives
fixed
fixes
fizzy
flags
flail
flair
flake
flaky
flame
flank
flaps
flare
flash
flask
flats
flaws
fleas
fleck
flees
fleet
flesh
flick
flied
flier
flies
fling
flint
flips
flirt
flits
float
flock
flogs
flood
floor
flops
flora
floss
flour
flout
flown
flows
flues
fluff
fluid
fluke
flung
flunk
flush
flute
foals
foams
foamy
focal
focus
foggy
foils
foist
folds
folks
folly
fonts
foods
fools
foots
foray
force
fords
fores
forge
forgo
forks
forms
forte
forth
forts
forty
forum
fouls
found
fount
fours
fowls
foxed
foxes
foyer
frail
frame
franc
frank
fraud
frays
freak
freed
freer
frees
fresh
frets
friar
fried
fries
frill
frisk
frock
frogs
frond
front
frost
froth
frown
froze
fruit
fudge
fuels
fulls
fully
fumed
fumes
funds
fungi
funny
furls
furor
furry
fused
fuses
fussy
fuzzy
gable
gaily
gains
gaits
galas
gales
galls
gamed
gamer
games
gamma
gamut
gangs
gaped
gapes
garbs
gases
gasps
gated
gates
gaudy
gauge
gaunt
gauze
gavel
gawks
gawky
gayer
gazed
gazes
gears
geese
genes
genie
genii
genre
gents
genus
germs
ghost
ghoul
giant
gibed
gibes
giddy
gifts
gilds
gills
gilts
gimme
girls
girth
given
gives
glade
glads
gland
glare
glass
glaze
gleam
glean
glens
glide
glint
gloat
globe
gloom
glory
gloss
glove
glows
glued
glues
gluts
gnash
gnats
gnaws
gnome
goads
goals
goats
godly
going
golds
golfs
goner
gongs
gonna
goods
goody
gooey
goofs
goofy
goons
goose
gored
gores
gorge
gouge
gourd
gowns
grabs
grace
grade
graft
grain
grams
grand
grant
grape
graph
grasp
grass
grate
grave
gravy
grays
graze
great
greed
green
greet
grids
grief
grill
grime
grimy
grind
grins
gripe
grips
grits
groan
groin
groom
grope
gross
group
grove
growl
grown
grows
grubs
gruel
gruff
grunt
guard
guess
guest
guide
guild
guile
guilt
guise
gulch
gulfs
gulls
gully
gulps
gummy
guppy
gurus
gusts
gusty
guyed
habit
hacks
hails
hairs
hairy
haled
haler
hales
halls
halon
halos
halts
halve
hands
handy
hangs
happy
hardy
hared
harem
hares
harks
harms
harps
harry
harsh
harts
haste
hasty
hatch
hated
hates
hauls
haunt
haven
haves
havoc
hawks
hayed
hazed
hazel
hazes
heads
heady
heals
heaps
heard
hears
heart
heath
heats
heave
heavy
hedge
heeds
heels
hefty
heirs
hello
helms
helps
hence
herbs
herds
heron
hewed
hicks
hided
hides
highs
hiked
hiker
hikes
hills
hilly
hilts
hinds
hinge
hints
hired
hires
hitch
hived
hives
hoard
hobby
hobos
hocks
hoist
holds
holed
holes
holly
homed
homes
homey
honed
hones
honey
honks
honor
hoods
hoofs
hooks
hoops
hoots
hoped
hopes
horde
horns
horny
horse
hosed
hoses
hosts
hotel
hotly
hound
hours
house
hovel
hover
howls
huffs
huffy
huger
hulks
hulls
human
humid
humor
humps
hunch
hunks
hunts
hurls
hurry
hurts
husks
husky
hutch
hyena
hymns
icier
icing
icons
ideal
ideas
idiom
idiot
idled
idler
idles
idols
igloo
image
impel
imply
inane
incur
index
inept
inert
infer
infix
inked
inlay
inlet
inner
input
inter
iotas
irate
irked
irons
irony
isles
issue
itchy
items
ivies
ivory
jacks
jaded
jades
jails
jambs
jaunt
jawed
jeans
jeers
jells
jelly
jerks
jerky
jests
jetty
jewel
jibed
jibes
jiffy
jilts
joins
joint
joked
joker
jokes
jolly
jolts
joyed
judge
juice
juicy
jumbo
jumps
jumpy
junks
junta
juror
karat
kayak
keels
keens
keeps
keyed
khaki
kicks
kills
kilns
kilos
kilts
kinda
kinds
kings
kinks
kinky
kiosk
kited
kites
kitty
kiwis
knack
knead
kneed
kneel
knees
knelt
knife
knits
knobs
knock
knoll
knots
known
knows
koala
kudos
label
labor
laced
laces
lacks
laden
ladle
lager
lairs
lakes
lambs
lamed
lamer
lames
lamps
lance
lands
lanes
lanky
lapel
lapse
lards
large
larks
larva
laser
lasts
latch
later
latex
lathe
lauds
laugh
lavas
lawns
laxer
layer
leach
leads
leafs
leafy
leaks
leaky
leans
leaps
leapt
learn
lease
leash
least
leave
ledge
leech
leeks
leers
leery
lefts
legal
lemme
lemon
lends
leper
letup
levee
level
lever
liars
libel
licks
lifts
light
liked
liken
likes
lilac
lilts
limbo
limbs
limed
limes
limit
limps
lined
linen
liner
lines
lingo
links
lions
lisps
lists
liter
lithe
lived
liven
liver
lives
livid
llama
loads
loafs
loans
loath
lobby
lobes
local
locks
lodge
lofts
lofty
logic
loins
lolls
longs
looks
looms
loons
loony
loops
loose
loots
loped
lopes
lords
lorry
loser
loses
lotus
louse
lousy
loved
lover
loves
lowed
lower
lowly
loyal
lucid
lucks
lucky
lulls
lumps
lumpy
lunar
lunch
lunge
lungs
lurch
lured
lures
lurid
lurks
lusts
lusty
lutes
lying
lymph
lynch
lyres
lyric
maced
maces
macho
madam
madly
magic
maids
mails
maims
mains
maize
major
maker
makes
males
malls
malts
mamas
manes
mange
mango
mangy
mania
manic
manly
manor
maple
march
mares
maria
marks
marry
marsh
marts
masks
mason
masts
match
mated
mates
matte
mauls
mauve
maxim
maybe
mayor
mazes
meals
mealy
means
meant
meats
medal
media
meets
melon
melts
memos
mends
menus
meows
mercy
meres
merge
merit
merry
messy
metal
meted
meter
metes
mewed
midst
miens
might
miked
mikes
miles
milks
milky
mills
mimed
mimes
mimic
mince
minds
mined
miner
mines
minks
minor
mints
minus
mired
mires
mirth
miser
mists
misty
mites
mitts
mixed
mixer
mixes
moans
moats
mocks
modal
model
modes
moist
molar
molds
moldy
moles
molts
money
monks
month
moods
moody
mooed
moons
moors
moose
moots
moped
mopes
moral
morns
moron
mossy
motel
moths
motif
motor
motto
mound
mount
mourn
mouse
mousy
mouth
moved
mover
moves
movie
mowed
mower
mucks
mucus
muddy
muffs
muggy
mulch
mules
mulls
multi
mummy
mumps
munch
mural
murky
mused
muses
mushy
music
musts
musty
muted
muter
mutes
mutts
myths
nails
naive
naked
named
names
napes
nasal
nasty
natty
naval
navel
nears
necks
needs
needy
neigh
nerve
nests
never
newer
newly
newsy
newts
nicer
niche
nicks
niece
nifty
night
nines
ninny
ninth
nippy
noble
nobly
nodes
noise
noisy
nomad
nooks
noose
norms
north
nosed
noses
notch
noted
notes
nouns
novel
nuder
nudes
nudge
nulls
numbs
nurse
nutty
nylon
nymph
oared
oases
oasis
oaths
obese
obeys
oboes
occur
ocean
octal
odder
oddly
odors
offed
offer
often
ogled
ogles
ogres
oiled
okays
okras
olden
older
olive
omega
omens
omits
onion
onset
oozed
oozes
opals
opens
opera
opium
opted
optic
orals
orbit
order
organ
other
otter
ought
ounce
ousts
outdo
outed
outer
ovals
ovary
ovens
overs
overt
owing
owned
owner
oxide
ozone
paced
paces
packs
pacts
paddy
pagan
paged
pager
pages
pails
pains
paint
pairs
paled
paler
pales
palls
palms
panda
panel
panes
pangs
panic
pansy
pants
papal
papas
paper
parch
pared
pares
parka
parks
parse
parts
party
passe
pasta
paste
pasts
pasty
patch
pates
paths
patio
patty
pause
paved
paves
pawed
pawns
payed
peace
peach
peaks
peals
pearl
pears
pecan
pecks
pedal
peeks
peels
peeps
peers
peeve
pelts
penal
pence
penis
penny
peons
peony
perch
peril
perks
perky
pesky
pests
petal
peter
petty
phase
phone
phony
photo
piano
picks
picky
piece
piers
piety
piked
pikes
piled
piles
pills
pilot
pinch
pined
pines
pinks
pints
pious
piped
pipes
pique
pitch
pithy
pivot
pixie
pizza
place
plaid
plain
plane
plank
plans
plant
plate
plays
plaza
plead
pleas
pleat
plied
plies
plods
plops
plots
plows
ploys
pluck
plugs
plume
plump
plums
plush
poach
poems
poets
point
poise
poked
poker
pokes
polar
poled
poles
polio
polka
polls
polyp
ponds
pools
poops
poppy
porch
pored
pores
ports
posed
poses
posts
pouch
pound
pours
pouts
power
prank
prawn
prays
preen
press
preys
price
prick
pride
pried
pries
prime
primp
print
prior
prism
privy
prize
probe
prods
proms
prone
prong
proof
props
prose
proud
prove
prowl
prows
proxy
prude
prune
psalm
pucks
pudgy
puffs
puffy
puked
pukes
pulls
pulps
pulse
pumas
pumps
punch
punks
punts
pupil
puppy
puree
purer
purge
purrs
purse
pushy
pussy
putts
putty
pyres
quack
quail
quake
qualm
quark
quart
quash
quays
queen
queer
quell
query
quest
queue
quick
quiet
quill
quilt
quips
quirk
quite
quits
quota
quote
rabbi
rabid
raced
racer
races
racks
radar
radii
radio
rafts
raged
rages
raids
rails
rains
rainy
raise
raked
rakes
rally
ramps
ranch
range
ranks
rants
raped
rapes
rapid
rared
rarer
rares
rasps
rated
rates
ratio
ratty
raved
ravel
raven
raves
rawer
rayon
razed
razes
razor
reach
react
reads
ready
realm
reals
reams
reaps
rears
rebel
rebut
recap
recur
redid
reeds
reefs
reeks
reels
refer
regal
reign
reins
relax
relay
relic
remit
rends
renew
rents
repay
repel
reply
reset
resin
rests
retch
retry
reuse
revel
revue
rhino
rhyme
riced
rices
rider
rides
ridge
rifer
rifle
rifts
right
rigid
rigor
riled
riles
rinds
rings
rinks
rinse
riots
ripen
riper
risen
riser
rises
risks
risky
rites
rival
river
rivet
roach
roads
roams
roars
roast
robed
robes
robin
robot
rocks
rocky
rodeo
rogue
roles
rolls
roman
romps
roofs
rooks
rooms
roomy
roost
roots
roped
ropes
roses
rotor
rouge
rough
round
rouse
route
routs
rowdy
rowed
royal
ruddy
ruder
ruffs
rugby
ruing
ruins
ruled
ruler
rules
rummy
rumor
rumps
runes
rungs
runny
runts
rural
ruses
rusts
rusty
saber
sacks
sadly
safer
safes
sagas
sager
sages
sails
saint
sakes
salad
sales
sally
salon
salts
salty
salve
sands
sandy
saner
saris
sassy
satin
sauce
saucy
sauna
saute
saved
saver
saves
savor
savvy
sawed
scabs
scald
scale
scalp
scaly
scans
scant
scare
scarf
scars
scary
scene
scent
scoff
scold
scoop
scoot
scope
score
scorn
scour
scout
scowl
scram
scrap
screw
scrub
scuff
scums
seals
seams
sears
seats
sects
sedan
seeds
seedy
seeks
seems
seeps
seize
sells
semen
sends
sense
serum
serve
seven
sever
sewed
sewer
sexed
sexes
shack
shade
shady
shaft
shake
shaky
shall
shalt
shame
shams
shape
share
shark
sharp
shave
shawl
sheaf
shear
sheds
sheen
sheep
sheer
sheet
shelf
shell
shied
shies
shift
shine
shins
shiny
ships
shire
shirk
shirt
shoal
shock
shoes
shone
shook
shoos
shoot
shops
shore
shorn
short
shots
shout
shove
shown
shows
showy
shred
shrew
shrub
shrug
shuck
shuns
shunt
shuts
shyer
sicks
sided
sides
sidle
siege
sieve
sifts
sighs
sight
sigma
signs
silks
sills
silly
silos
silts
since
sinew
singe
sings
sinks
sinus
sired
siren
sires
sissy
sited
sites
sixes
sixth
sixty
sized
sizes
skate
skein
skews
skids
skied
skies
skill
skimp
skims
skins
skips
skirt
skits
skulk
skull
skunk
slabs
slack
slain
slake
slams
slang
slant
slaps
slash
slate
slats
slave
slays
sleds
sleek
sleep
sleet
slept
slews
slice
slick
slide
slier
slime
slims
slimy
sling
slink
slips
slits
slobs
slogs
slope
slops
slosh
sloth
slots
slows
slugs
slump
slums
slung
slunk
slurs
slush
sluts
slyly
smack
small
smart
smash
smear
smell
smelt
smile
smirk
smith
smock
smogs
smoke
smoky
smuts
snack
snags
snail
snake
snaps
snare
snarl
sneak
sneer
snide
sniff
snipe
snips
snobs
snoop
snore
snort
snots
snout
snows
snowy
snubs
snuff
snugs
soaks
soaps
soapy
soars
sober
socks
sodas
sofas
soggy
soils
solar
soled
soles
solid
solos
solve
songs
sonic
sooty
sorer
sores
sorry
sorta
sorts
souls
sound
soups
sours
south
sowed
space
spade
spank
spans
spare
spark
spars
spasm
spate
spats
spawn
spays
speak
spear
speck
speed
spell
spend
spent
sperm
spews
spice
spicy
spied
spies
spike
spill
spine
spins
spire
spite
spits
splat
split
spoil
spoke
spoof
spook
spool
spoon
sport
spots
spout
spray
spree
sprig
spuds
spunk
spurn
spurs
spurt
squad
squat
squid
stabs
stack
staff
stage
stags
staid
stain
stair
stake
stale
stalk
stall
stamp
stand
stank
stare
stark
stars
start
state
stave
stays
steak
steal
steam
steel
steep
steer
stems
steps
stern
stews
stick
stiff
still
sting
stink
stint
stirs
stock
stoke
stole
stomp
stone
stony
stood
stool
stoop
stops
store
stork
storm
story
stout
stove
stows
strap
straw
stray
strew
strip
strum
strut
stubs
stuck
studs
study
stuff
stump
stung
stunk
stuns
stunt
style
suave
sucks
suede
sugar
suing
suite
suits
sulks
sulky
sunny
sunup
super
surer
surfs
surge
surly
swabs
swamp
swans
swaps
swarm
swats
sways
swear
sweat
sweep
sweet
swell
swept
swift
swigs
swill
swims
swine
swing
swipe
swirl
swish
swoon
swoop
sword
swore
sworn
swung
syrup
tabby
table
taboo
tacit
tacks
tacky
tacos
tails
taint
taken
takes
tales
talks
tally
talon
tamed
tamer
tames
tango
tangs
tanks
taped
taper
tapes
tardy
tarry
tarts
tasks
taste
tasty
tatty
taunt
tawny
taxed
taxes
taxis
teach
teaks
teams
tears
tease
teats
teems
teeth
tells
tempo
tempt
tends
tenet
tenor
tense
tenth
tents
tepee
tepid
terms
terse
tests
texts
thank
thaws
theft
their
theme
there
these
theta
thick
thief
thigh
thing
think
thins
third
thong
thorn
those
three
threw
throb
throw
thuds
thugs
thumb
thump
thyme
tiara
ticks
tidal
tided
tides
tiers
tiffs
tiger
tight
tilde
tiled
tiles
tills
tilts
timed
timer
times
timid
tinge
tinny
tints
tipsy
tired
tires
title
toads
toast
today
togas
toils
token
tolls
tombs
tomes
tonal
toned
tones
tongs
tonic
tools
tooth
toots
topaz
topic
torch
torso
total
toted
totem
totes
touch
tough
tours
towed
towel
tower
towns
toxic
toxin
toyed
trace
track
tract
trade
trail
train
trait
tramp
traps
trash
trawl
trays
tread
treat
treed
trees
treks
trend
trial
tribe
trick
tried
tries
trill
trims
trios
tripe
trips
trite
troll
troop
trots
trout
truce
truck
trued
truer
trues
truly
trump
trunk
trust
truth
tubas
tubed
tubes
tucks
tufts
tulip
tummy
tumor
tunas
tuned
tuner
tunes
tunic
turfs
turns
tusks
tutor
twang
tweak
tweed
tweet
twice
twigs
twine
twins
twirl
twist
tying
typed
types
udder
ulcer
ultra
uncle
uncut
under
undid
undue
unfit
unify
union
unite
units
unity
unset
untie
until
upend
upped
upper
upset
urban
urged
urges
urine
usage
users
usher
using
usual
usurp
uteri
utter
vague
valet
valid
valor
value
valve
vanes
vapor
vases
vasts
vault
veers
veils
veins
venom
vents
venue
verbs
verge
verse
verve
vests
vexed
vexes
vials
vicar
viced
vices
video
views
vigil
vigor
viler
villa
vines
vinyl
viola
viper
viral
virus
visas
vised
vises
visit
visor
vista
vital
vivid
vocal
vodka
vogue
voice
voids
volts
vomit
voted
voter
votes
vouch
vowed
vowel
vying
waded
wades
wafer
wafts
waged
wager
wages
wagon
waifs
wails
waist
waits
waive
waked
waken
wakes
walks
walls
waltz
wands
waned
wanes
wanna
wants
wards
warms
warns
warps
warts
wasps
waste
watch
water
watts
waved
waver
waves
waxed
waxes
weans
wears
weary
weave
wedge
weeds
weedy
weeks
weeps
weest
weigh
weird
welds
wells
welts
whack
whale
wharf
wheat
wheel
whens
where
whets
which
whiff
while
whims
whine
whips
whirl
whirs
whisk
white
whole
whoop
whore
whose
wicks
widen
wider
widow
width
wield
wilds
wills
wilts
wince
winch
winds
windy
wined
wines
wings
winks
wiped
wiper
wipes
wired
wires
wiser
wises
wisps
wispy
witch
witty
wives
woken
wolfs
woman
wombs
women
woods
woody
wooed
woofs
wools
words
wordy
works
world
worms
worry
worse
worst
worth
would
wound
woven
wowed
wraps
wrath
wreak
wreck
wrens
wrest
wring
wrist
write
writs
wrong
wrote
wrung
wryer
yacht
yanks
yards
yarns
yawns
yearn
years
yeast
yells
yelps
yeses
yield
yodel
yoked
yokel
yokes
yolks
young
yours
youth
yowls
zebra
zeros
zests
zincs
zoned
zones
zooms

Where it is served

The registry serves only AXLR clients, so a browser gets 403; fetch with a User-Agent that starts with axlr:

curl -A axlr-docs/1.0 -O https://registry.underpassai.com/tools/wordle_helper/1.0.0/manifest.json
curl -A axlr-docs/1.0 -O https://registry.underpassai.com/tools/wordle_helper/1.0.0/wordle_helper.py
curl -A axlr-docs/1.0 -O https://registry.underpassai.com/tools/wordle_helper/1.0.0/words5.txt