Skip to content

All tools (41)

JSON 6
Time & Date 4
Encoding & Decoding 4
Generators 3
Text & Data 4
Logs & Debugging 1
Config & Infra 3
Security & Hashing 4
Color & Design 5
Numbers & Bits 3
Web & Markup 4

Nothing leaves the cave.

Nothing you paste ever leaves your device. There is no server to send it to.

How you can check →
DevToolsCave

    This tool runs entirely in your browser. Nothing you paste is uploaded.

    How you can check →

    Slug Generator

    Text & Data

    Turn 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.

    Slug

    What changed

    No substitutions — the title mapped straight across.

    Validity

      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.

      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.