This tool runs entirely in your browser. Nothing you paste is uploaded.
How you can check →Slug Generator
Text & DataTurn a title into a URL-safe slug — with a named transliteration convention, a table of every substitution it made, and a loud error instead of a silent empty string.
What changed
No substitutions — the title mapped straight across.
Validity
| Title | Slug | Status |
|---|---|---|
| Paste titles above and click "Generate all". | ||
Options
Separator
Off by default: "The Best of Times" and "Best Times" both become "best-times" once stop words are dropped. Bulk mode's duplicate detection is what makes turning this on safe.
Truncation never cuts mid-grapheme, prefers cutting at a word boundary over mid-word, and trims a trailing separator afterward — which can make the result a little shorter than the limit.
No network activity while you use this tool Show the numbers
- Requests to any other server
- 0
- Requests since you started typing
- —
- Same-origin requests
- 0
Counted live by your browser's own Performance Timeline — the same data the DevTools Network panel reads. It cannot see what a browser extension does, and it is not meant to replace checking for yourself: here is how, in thirty seconds .
What a slug is, and why it matters
A slug is the URL-safe version of a title — the part after the last slash in
/blog/my-post-title/. It matters for two separate audiences at once: search
engines weight the words in a URL, and a human reading a link in a browser tab or a shared
message can tell what the page is about before clicking. A slug generator's whole job is
turning arbitrary human text — with capital letters, punctuation, accented characters,
sometimes an entirely different script — into something that survives being a URL path
segment without losing the words that made the title meaningful.
Why "Straße" becomes "stra-e" on most other tools
The standard recipe every slugify tutorial teaches is: Unicode-normalize to NFD, strip
combining marks, then drop anything outside [a-z0-9]. Measured directly:
"Straße".normalize("NFD") with marks stripped gives
"strae" after the specials filter runs, and the visible result on most
competing tools is the broken stra-e. The reason is that ß has no Unicode
decomposition at all — it isn't a base letter plus a combining accent, so mark-stripping
has nothing to strip and the character just falls through the ASCII filter and disappears.
The same recipe reduces "Привет мир" and "你好世界" to nothing but
a bare separator, because Cyrillic and CJK characters don't decompose into Latin letters at
all. This tool's Universal pack carries a small named exception map for exactly the
characters that break the naive recipe (ß, ø, đ, ł, æ, œ, þ and about three dozen more), so
the common case works by default, and named packs for Cyrillic and Greek handle those
scripts with a cited transliteration standard instead of silence.
Transliteration is a choice, not a fact
There is no single correct answer to "what does ä become in a URL". German software
convention expands it to ae; Scandinavian library-catalog convention drops the
dot and keeps a; a strict transliteration standard like ISO 9 for Cyrillic
maps a character to exactly one Latin character with a diacritic (ж → ž) so the mapping is
reversible, while the more familiar "zh" is not. Every one of these is defensible and none
of them is universal — two teams using two different libraries will get two different slugs
from the same title, and neither is a bug. This tool names the convention it used next to
the result instead of presenting a silent default, and its named packs are documented in the
file that implements them so the choice is traceable.
NFC vs NFD: two identical-looking inputs, two different slugs
A visually identical accented character can arrive as one composed code point (NFC — what
most browsers and text editors produce) or as a base letter plus a separate combining mark
(NFD — what macOS's filesystem and some input methods produce). They render the same on
screen and compare unequal with ===. A slugifier that doesn't normalize first
can turn the same-looking title into two different slugs depending on which form arrived,
which is exactly the kind of silent inconsistency non-negotiable #1 forbids. This tool
always normalizes to NFC before anything else touches the string, and states so.
Why removing stop words is off by default
Dropping "the", "of", "a" and similar words from a slug is a real, common option — it makes
slugs shorter and reads naturally to search engines. It also manufactures collisions no
naive implementation warns about: "The Best of Times" and "Best Times" both reduce to
best-times, and if your CMS doesn't handle that, the second post silently
overwrites the first post's URL or fails to save. This tool defaults the option off, and
bulk mode's duplicate detection — automatic -2, -3 suffixing — is
what makes turning it on safe for a real batch of titles.
RFC 3986 is necessary but not sufficient
RFC 3986's unreserved character set (A-Za-z0-9-._~) is what a URL path segment
is allowed to contain without percent-encoding, but a slug that technically satisfies it can
still be a bad slug: an all-digit string like 2024 collides with a numeric ID
route such as /posts/123; a bare . or .. is a reserved
relative-path segment in every URL and filesystem; CON, PRN and
the other Windows device names can break a filesystem-backed host trying to create a
matching file. This tool checks all of them and labels each one individually, rather than
folding them into one pass/fail verdict that doesn't say which rule failed.
A Unicode slug is legal — and becomes something else downstream
RFC 3987's IRI spec permits non-ASCII characters in a URL, so /blog/größe is a
valid, working link that renders correctly in a modern browser's address bar. But it doesn't
stay that way everywhere: server access logs, many analytics tools and older HTTP clients
record and transmit it as its percent-encoded byte form,
/blog/gr%C3%B6%C3%9Fe. Choosing "Keep Unicode" without seeing that encoded form
would hide the actual consequence of the choice, so this tool shows both side by side.
Frequently asked questions
- Why is my slug empty?
- Every character in the title was removed by the current options — the most common cause is an all-CJK or all-symbol title with the Universal transliteration pack, which only folds Latin-script diacritics. Switch to "Keep Unicode" to get an IRI-style slug instead of nothing.
- Why does "Straße" turn into "stra-e" on other slug generators?
- The recipe most tutorials teach — Unicode NFD normalization, strip combining marks, drop everything outside [a-z0-9] — silently breaks on ß because it has no decomposition at all; mark-stripping can't touch a letter that isn't built from a base letter plus a diacritic. This tool's Universal pack carries a small exception map for exactly those characters (ß, ø, đ, ł, æ, œ, þ and more), so "Straße" becomes "strasse", not "stra-e".
- Which transliteration pack should I use?
- Universal (the default) handles ordinary Latin-script diacritics and the letters with no decomposition. Pick a named pack — German, Scandinavian, Turkish, Greek (ISO 843), Cyrillic (ISO 9) — when your titles are consistently in one of those scripts and you want its specific convention (ä → ae in German vs ä → a in Scandinavian is a real, deliberate disagreement, not a bug). Pick Keep Unicode for an IRI-style slug that keeps the original script.
- Why does the tool warn about all-digit slugs?
- A slug like "2024" collides with a numeric ID route such as /posts/123 — a router that matches both patterns can't tell them apart. The validity panel flags this and any of six other practical problems (leading/trailing separators, "." or "..", Windows reserved device names, RFC 3986 violations) that a slug can have even though its characters all look fine.
- What does bulk mode do with duplicate slugs?
- It numbers them. If two titles in your batch both slugify to "best-times", the first keeps it and the second becomes "best-times-2" — the same collision-handling behaviour a CMS needs when a batch of titles is imported at once, applied automatically and shown in the status column.
- Does this tool send my titles anywhere?
- No. Slugification, transliteration and validation all run in your browser. Nothing you type is logged, stored or transmitted.
- Is a Unicode slug actually safe to use in a URL?
- It's legal — IRIs (RFC 3987) permit non-ASCII characters, and it will render fine in a modern browser's address bar. But it arrives in server logs, analytics and some older tooling as its percent-encoded form (größe becomes gr%C3%B6%C3%9Fe), which is longer and unreadable. The preview below shows both forms so you see the consequence before choosing Keep Unicode.
Explore more tools
Convert text between 19 cases — sentence, Title, camelCase, snake_case and more — with an acronym-safe tokenizer and a receipt for every change.
Percent-encode or decode a URL, with proof the result round-trips.
Paste a table, get sums and averages instantly — with nothing mangled.