The slug is the readable tail of a web address — the my-first-post in example.com/blog/my-first-post. It is the part a person can read before deciding whether to click, and the part a search engine reads as a short description of what the page holds, which is why it deserves more thought than a database id or a date. This free generator turns any text into one: paste a title into Text to convert, press Generate, and the result appears with a copy button beside it. The defaults are the settings most sites want — lowercase, hyphens between words, common filler words dropped, non-Latin letters transliterated — so a usable slug is one click away, and every one of those decisions is a switch you can change.
Everything happens on your own device. The page loads a small JavaScript engine and runs it locally: your titles are never uploaded, never logged, and the tool keeps working with the connection switched off. That is also why the result updates the moment you change a setting. The order of the work is worth stating, because it is what makes the output predictable: a pasted link is reduced to its last path segment first, then the text is lowercased, then stop words are dropped, then non-Latin characters are transliterated, then numbers and special characters are removed if you asked for that, then whatever is left is joined with your separator, then the result is trimmed to the maximum length, and finally a repeat gets a numeric suffix. Text to convert accepts up to 500,000 characters in one go, which is a few thousand article titles.
One line in, one slug out. Paste a whole list of titles and each line becomes its own numbered slug, with the title it came from shown above it in grey, so in a batch of fifty you can still tell which slug belongs to which heading. A list that already lives in a file does not have to travel through the clipboard: Load from file, the button beside the input box, opens a plain text file — .txt, .csv, .md, .json and the like — and drops its contents into the field. Your browser reads that file exactly the way it reads what you type, and it is not uploaded anywhere. Split input by decides how the list is cut apart. Automatic is the default: a line break always separates items, while a comma only separates them when the input is a single line whose parts all look like standalone values — so "price 3,5 EUR" and "Chapter 5: results, conclusions" stay whole instead of shattering into fragments. Line break, Comma and Space force the choice when you already know the shape of your data. Output format decides how a batch comes back when you take it — one per line, space-separated, or comma-separated — and both Copy All and Save to File follow it. History keeps your last 10 batches in your own browser, so a list you converted an hour ago is still there.
Non-Latin text is the part most slug generators get roughly right and few get exactly right. A web address can hold letters of any alphabet, and search engines read them, but many sites still prefer plain ASCII, which copies, pastes and passes through every system without percent-encoding. Where you want ASCII, Cyrillic, Greek, Arabic, Chinese and European accented letters have to be converted, and the real question is by whose rule. This page answers it in two layers. The general layer covers every script: a transliteration library with a sensible ASCII answer for almost any character you can type, which is what Transliterate from means when it says Automatic (any language). The specific layer is a set of hand-built tables for the languages where the generic answer is not the one the country actually uses; the Transliterate from menu names the ones that have a table today, and the set grows as the tool reaches more languages that need one. Choosing one loads its table into an editable grid under Transliteration Rules, where every letter is a text field you can change, and Reset rules to default puts it back. The Ukrainian table follows Cabinet of Ministers Resolution No. 55 of 2010, the standard printed in Ukrainian passports, including the details that are easy to miss: зг becomes zgh rather than zh so it stays distinct from ж; є, ї, й, ю and я take one form at the start of a word and another inside it; and the apostrophe and the soft sign are dropped without starting a new word, so Знам'янка comes out as znamianka and not znamyanka. German defaults to the expanded ä → ae, ö → oe, ü → ue that German addresses actually use, with a plain ä → a variant if you prefer it.
Remove stop words is on by default. It drops the small connecting words — a, the, and, of, for — that usually lengthen a slug without adding meaning. Usually, not always: flights to London and flights from London differ only in a stop word, so check the result when a small word carries the point. The list under Stop words is fully editable and arrives already filled in: an English list plus a list for the language of the page you are on, so the Ukrainian page knows в, на, та and і, and the German page knows der, die and das. Add words of your own, delete the ones you want kept, or switch the feature off entirely, in which case the field greys out rather than pretending to still matter. Two honest notes about it. Stripping stop words is a small tidiness gain rather than a ranking lever — you get a shorter, cleaner address, not a better position. And if every word in a title happens to be on the list, the honest result is nothing at all, so the tool tells you that instead of handing you an empty box.
The rest of the switches decide the shape. Separator in the slug chooses what sits between words, and the hyphen default follows Google's own advice to separate the words of a URL with hyphens rather than underscores. Underscore is there for the systems that insist on it. Lowercase is on because most servers treat addresses as case-sensitive, and mixed case is an easy way to end up with two URLs for one page. Remove special characters strips everything that is not a letter, digit, space, hyphen or underscore, which is what keeps punctuation, quotation marks and emoji out of an address — emoji are removed before transliteration specifically so that a rocket does not become the word rocket. Remove numbers is off, because a number in a title is usually part of the title. Max Length runs from 10 to 200 and defaults to 80; when a slug is longer than that the engine cuts at the last whole word that fits rather than through the middle of one; only a single word longer than the whole limit has to be cut inside itself. The figure beside each result is its length in characters, and it turns red past 60 — our own readability guide rather than a search-engine limit: beyond it a slug gets hard to read at a glance and awkward to paste into a message.
Two more switches exist because they turn a bulk conversion back into a one-click job. Make slugs unique catches the case where two different titles reduce to the same slug — "Top 10 tips" and "Top-10 tips" both become top-10-tips — and gives the second one a -2, the third a -3, shortening the base first if the suffix would push it past your maximum length. Two pages at one address is a problem far cheaper to catch in this list than in your CMS. Take the slug from a pasted URL works in the other direction: paste a full link and the tool takes the last part of the path, drops the query string and any .html or .php ending, and decodes percent-encoding, so a Wikipedia link ending in %D0%9B%D1%8C%D0%B2%D1%96%D0%B2 comes back as lviv instead of a run of hex digits. It only fires when the entire line is a link, so an address quoted inside a sentence is left where it is.
Why choose this slug generator?
- Browser-only: your titles are never uploaded, and the page keeps working offline
- Bulk conversion from a paste or a text file, with the source title above every slug
- Real transliteration standards per language, not one generic table for all of them
- Ukrainian by Resolution No. 55 of 2010 — the spelling used in passports
- Every rule editable letter by letter, with a one-click reset
- Automatic -2 and -3 suffixes so no two slugs in a batch collide
- Paste a link and get the slug out of it, percent-encoding decoded
- An editable stop word list that arrives filled in for your language
- Truncation at a whole word wherever possible, with a character count beside each result
- Free and unlimited: no sign-up, no quota, nothing kept on our servers
Slugs are needed wherever a page has to carry a readable address. A blog or news site turns every headline into one, which is the case this tool was shaped around: paste the week's headlines, get the week's URLs. An online shop does the same for product and category names, usually in bulk after an import, and often in a language whose letters the shop wants as plain ASCII. Documentation and knowledge bases build anchors and file names the same way. Beyond web addresses the same clean string is what you want for a file name that will not break on another operating system, a database key that a person can read in a log, a branch name, an image name in a media library, or the identifier of a section in a static site generator. Any place where a human-readable name has to survive being put into a machine-readable field is a place a slug belongs.
A few limits are worth knowing before you rely on it. This is a generator, not a validator: it will not check whether a slug is already taken on your site, because it has no idea what your site contains — the uniqueness it guarantees is within the batch in front of you. Redirects are your job too; changing the slug of a published page breaks its old address, and that is a decision for your CMS rather than for this tool. Save to File writes plain text, not CSV or JSON. The automatic split makes a judgement call about commas that is right in almost every case but not in all of them, which is exactly why Split input by lets you overrule it. And transliteration is a convention rather than a translation — München becomes muenchen, not Munich — so when a page has an established name in the target language, that name is a better slug than any automatic conversion of the original.