⭐ 0

Fantasy Name Generator

Build ten Latin-script names from a race's syllable tables. The page opens on elf, gender Any, and surname off. Each click uses crypto random.

Processed entirely in your browser — nothing you enter here is ever uploaded.

Click a name to copy it

Processing... 0%

Result

About this tool

Each race is five lists: 15 capitalized onsets, 10 lowercase middles, 15 neutral codas, 6 masculine endings, and 6 feminine endings. The menus open on elf and Any, and the surname box opens unchecked. A given name is one onset, then a middle syllable on a one-in-two draw, then an ending. Gender Any always takes the ending from the 15 codas. Male takes a masculine ending on two of every three draws and a coda otherwise. Female does the same with the feminine list. An elf combination that the tables allow is Ael + la + rion, which spells Aellarion. That is one possible draw, not the name the page promises. The next click is a new set of ten.

The ten names are unique inside the batch. A duplicate is thrown away, and the loop gives up after 200 attempts so a tiny filtered space cannot spin forever. With the full elf tables the space is far larger than ten, so the guard does not normally cut the list short. Surname, when checked, appends a space and then either a second generated word or one of the 15 epithets, each with probability one half. The epithets are phrases such as of the North and of the Ember Vale. They are not place names from a published setting. Changing the race, the gender, or the surname box generates a new batch immediately. The first batch is also generated on load, including on a preset page that has already selected elf, dwarf, orc, human, dragon, or wizard.

The random source is crypto.getRandomValues with rejection sampling, so the index is uniform. It is not Math.random. The names are always these Latin syllables, including on translated pages of the tool, because the tables are not translated. The page does not check a name against a trademark list at runtime, and it does not decline a name for pronunciation. Copy on a single button writes that name. The output box is the ten names separated by newlines. There is no meaning glossary and no audio pronunciation.

The six race keys are elf, dwarf, orc, human, dragon, and wizard, and each key points at its own five lists rather than a shared pool. A checked surname flips a coin: one side appends a second given name built the same way, the other side appends one of the 15 epithets. The single-name copy button shows the copied message for 1200 ms and ignores further clicks until that timer ends. The batch loop stops at 10 unique names or at 200 attempts, whichever comes first. Generate is the only action. There is no Execute button on this page.

Example. Each click returns 10 unique names. Elf, gender Any, surname off is an onset, a middle syllable half the time, and one of 15 codas. Ael + la + rion spells Aellarion.

Limit. Six races, 15 onsets each. The batch gives up after 200 attempts. Surnames are off until you check the box. Names are Latin syllables, not a dictionary.

Frequently asked questions

How is one elf name assembled?

One of 15 onsets, then one of 10 middles on half of the draws, then an ending. Gender Any uses the 15 codas. Ael, la, and rion are all in the elf table, so Aellarion can appear. It is not reserved as the sample output.

What do male, female, and surname change?

Male and female take a gendered ending on two of every three draws and a coda otherwise. Each gendered list has 6 endings. Surname, off by default, appends either a second generated word or one of 15 epithets, half the time each.

Why are there always ten names?

The loop keeps unique strings until it has 10 or it has tried 200 times. With the full tables, 10 unique names fit. Changing race, gender, or the surname box generates again. The first batch runs on load.

Are the names translated?

No. The syllable tables are Latin-script data shared by every locale. The random index uses crypto.getRandomValues. Click a name to copy it, or copy the ten lines together.