Slug Generator
Turn any title into a clean URL slug — language-aware diacritics folding, batch mode with CSV — entirely on this device.
The slug appears here as you type.
Press ? for shortcuts
Do it offline:$ echo "10 Best Cafés in São Paulo!" | iconv -f UTF-8 -t ASCII//TRANSLIT | tr '[:upper:]' '[:lower:]' | sed -E 's/[^a-z0-9]+/-/g;s/^-+|-+$//g'
How to use it
- Paste a title in Single mode — the slug renders under the field on every keystroke.
- Pick language-aware transliteration and a locale when umlauts or Nordic vowels should fold to digraphs.
- Set separator, case, stopword, length, Unicode, and ampersand options to match your CMS's rules.
- In Batch mode, paste one title per line and download the table as CSV.
A slug is the words-only tail of a URL: lowercase letters, digits, and separators. Paste a title and this page folds accents, punctuation, and spacing into that shape as you type — with a language-aware mode that turns German ö into oe instead of o, batch conversion for one title per line, and CSV download. Everything runs in this browser tab; nothing is uploaded.
How it works
Folding runs as a pipeline: Unicode normalization splits each accented letter into a base letter plus combining marks (UAX #15), the marks are dropped, and a small table covers the Latin letters that never decompose — ß to ss, ø to o, œ to oe. Everything not a kept letter or digit collapses into the separator, runs merge, ends trim, and the case, stopword, and length options apply last.
Plain and language-aware modes disagree about what an umlaut means. A plain fold sees ö as o plus a diaeresis and keeps the o — what most slug libraries do. German orthography spells a lost umlaut as an e-digraph, so German mode rewrites ä, ö, ü to ae, oe, ue before any mark is stripped; Danish and Norwegian map ø→oe, å→aa, æ→ae. ß becomes ss in every mode, and with lowercasing off, case survives the mapping — Größe becomes Groesse.
Examples
10 Best Cafés in São Paulo!10-best-cafes-in-sao-pauloAll defaults: é and ã lose their accents, spaces become hyphens, and trailing punctuation trims away.
Über uns – Größeueber-uns-groesseGerman mode: Ü folds to ue and ö to oe, the digraphs a German reader expects.
Über uns — Größeuber-uns-grosseThe same words, plain fold: only base letters remain. This row carries an em dash where the row above used an en dash — every dash width folds into the one separator.
don't stop & godont-stop-and-goThe apostrophe vanishes between letters, curly ’ included, and the ampersand option writes the locale's word; left on fold, & becomes a separator instead: dont-stop-go.
こんにちは 世界こんにちは-世界Keep-Unicode mode retains letters and digits of any script — an IRI-style slug (RFC 3987); plain-URI contexts percent-encode it on the wire.
Every example on this page is executed against the same engine that powers the tool, on every build.
Gotchas worth knowing
No Latin fold means dropped — and the page says so
Normalization cannot romanize: 東京 has no base letter, so strip mode drops it and a chip names the loss — romanization is planned (V2). Keep-Unicode is today's way to slug a Japanese or Cyrillic title.
Apostrophes vanish only between letters
Straight ' and curly ’ are elided between letters, keeping contractions one word; next to a digit the rule stops — 80's Playlist folds to 80-s-playlist.
Numerals-only titles are valid slugs
2026 stays 2026 — digits are kept and no rule demands a letter; only a title where nothing survives the fold raises the empty-result message.
Mixed scripts keep whichever side the mode keeps
Tokyo 東京 Guide folds to tokyo-guide under strip mode, the chip counting the loss; under keep-Unicode both scripts survive. Output re-composes to NFC, so decomposed paste slugs identically.
Separator runs always collapse to one
Spaces, commas, dashes of any width, and repeated punctuation merge into one separator, and the ends trim — even the separator itself: with underscore selected, hello-world now becomes hello_world_now.
Length limits cut at word boundaries, cut shown
At a maximum of 12, Ten Tips for Faster Web Pages becomes ten-tips-for, showing the removed faster-web-pages beside the result; a lone word longer than the limit is hard-cut, with a chip saying so.
Common errors
Nothing slug-safe remains after folding — try the Unicode-slug option- Strip mode keeps ASCII letters and digits; an emoji-only title has neither. Switch Unicode handling to keep, or add a word. An empty field is not this error; in Batch mode the sentence appears per row.
Input is larger than the 1 MB limit for this tool. For bigger payloads use the CLI: echo "10 Best Cafés in São Paulo!" | iconv -f UTF-8 -t ASCII//TRANSLIT | tr '[:upper:]' '[:lower:]' | sed -E 's/[^a-z0-9]+/-/g;s/^-+|-+$//g'- A refusal, never a truncation — the page slugs all of your batch or none of it. Below the cap, big lists still finish: past 10,000 lines or 256 KB the work moves to a background worker, cancellable.
FAQ
Which characters are safe in a URL slug?
RFC 3986 names an unreserved set — A–Z, a–z, 0–9, hyphen, period, underscore, tilde — that never needs escaping anywhere in a URL. This page emits letters, digits, and your separator — the conservative core.
When is language-aware folding the right choice?
When the audience reads the language: a German visitor recognizes ueber-uns as über uns, and uber-uns as a different word; Danish and Norwegian share the convention for ø, å, and æ. Plain mode matches what most slug libraries emit.
Do non-Latin slugs actually work in browsers?
Yes — RFC 3987 defines the IRI form with Unicode letters directly in the path; browsers resolve them, and Wikipedia article URLs use it daily. On the wire the path travels percent-encoded as UTF-8 — why a copied link can expand into %E4-style escapes.
Should I strip stopwords from slugs?
No ranking promise is made here — that is not verifiable on this page. The measurable effect: The Art of the Deal shrinks from the-art-of-the-deal to art-deal. Skip it when small words carry meaning, as in On Writing.
Keyboard shortcuts
- ⌘/Ctrl + Enter
- Re-run the conversion in either mode.
- ⌘/Ctrl + S
- Download the slug (.txt) or batch table (.csv).
- ⌘/Ctrl + C
- Copy the slug or CSV when nothing is selected.
- ⌘/Ctrl + Shift + C
- Copy the result even while a selection exists.
- t
- Cycle the theme palette.
- ? or ⌘/Ctrl + /
- Show the shortcut help dialog.
- Esc
- Close the topmost dialog; input stays.