Why I Built My Own Wordle
Like a lot of developers, I enjoy Wordle.
But after playing for a while, I realised I didn’t just want to play it — I wanted to understand it.
So instead of cloning a template, I built my own Wordle engine from scratch.
Not because the world needed another clone.
But because I wanted:
- Full control over the word pool
- Seeded daily logic I understood completely
- A stats system I could extend cleanly
- And a version that reflected how I actually think when solving puzzles
That’s how Web Weavers Wordle started.
Custom Word Pool (Under 1k → Nearly 6k Words)
Originally, my word list was tiny — under 1,000 entries.
It worked, but it felt constrained.
So I rebuilt the dictionary layer entirely.
Instead of a single static list, I moved to:
- Separate
.txtfiles per word length - Dynamic loading
- A combined
VALID_SETfor fast validation - Per-length counts for UI stats
The pool is now just under 6,000 words, all curated to match the theme (every answer starts with W).
It’s modular, scalable, and easy to extend — without bloating the main script.
That refactor alone made the project feel like a proper engine instead of a weekend experiment.
Daily Logic (Seeded, Predictable, Controlled)
For the daily mode, I didn’t want randomness.
I implemented seeded selection based on the local date:
function seedFromDate() {
const d = new Date();
return d.getFullYear() * 10000 + (d.getMonth() + 1) * 100 + d.getDate();
}
This means:
- Everyone gets the same word on the same day
- The day flips at local midnight
- No server needed
- No external API calls
It’s deterministic and self-contained.
Which is exactly how I like my systems.
The UX Gap I Noticed
This is where it got interesting.
When solving Wordle, I don’t like filling unknown spaces with random letters.
Before, if I was thinking through a word like:
W _ S T _
I would temporarily type something like:
W W S T W
Just to fill the row visually.
But that felt wrong.
Those letters weren’t information — they were noise.
So I added a new state.
A manual ? placeholder.
Now I can type:
W ? S T ?
It:
- Visually preserves structure
- Doesn’t affect validation
- Cannot be submitted
- Acts as a deliberate “unknown” marker
It sounds tiny.
But it fundamentally changed how the puzzle feels to solve.
It added an intentional “thinking state” between blank and evaluated.
And I haven’t seen other clones do that.
What I Didn’t Build (Yet)
I considered expanding daily mode to every word length.
Technically, it would be easy.
Architecturally? It touches:
- Stats storage
- Streak logic
- UI distribution trees
- LocalStorage keys
- Share formatting
So I didn’t.
The current version is:
- Stable.
- Clean.
- Focused.
I’d rather refine than expand.
Final Thoughts
This project started as curiosity.
It’s now a modular, seeded, PWA-enabled Wordle engine with:
- Nearly 6,000 words
- Custom daily logic
- Clean stats tracking
- Share image generation
- And a small UX improvement I genuinely love
Sometimes the best way to understand a system is to rebuild it.
And sometimes rebuilding it lets you improve it in small, meaningful ways.
The live version is here, if you'd like to try it; https://webweaversworld.co.uk/html/main/wordle/index.html
Top comments (0)