Turn any text into a URL-safe slug with ASCII transliteration and configurable separators.
Updated
Input
Any text — headlines, file names, foreign-script strings, free-form sentences.
Try:
Separator
Options
Slug
⌘EnterCopy slug
⌘KClear input
Quick start
How to slugify text
Paste any string, pick a separator, copy the URL-safe slug.
Step 1
Type or paste the source text
Headlines, file names, foreign-script strings — the pipeline normalises diacritics and strips punctuation.
Step 2
Choose a separator and options
Hyphen (default) for URLs, underscore for code, dot for keys, none for camelCase IDs. Tune transliterate, case and max-length.
Step 3
Copy the slug
Hit Copy or ⌘/Ctrl+Enter. The slug is safe to drop straight into a URL path segment.
In-depth guide
Slugify: turn any text into a URL-safe slug
A slug is a short string built from [a-z0-9] plus a separator, suitable for use as a URL path segment, a filename, or a stable database identifier. This tool runs the canonical pipeline — substitute → decompose → strip → separate — entirely in your browser, with a few knobs for the edge cases.
NFD normalisation (String.prototype.normalize("NFD")) splits accented characters into a base letter plus a combining mark.
Strip combining marks via /\p{M}+/u. After this step, café is cafe and naïve is naive.
Lowercase (optional) using the default locale.
Replace any run of non-[a-z0-9] (or non-letter/digit when transliterate is off) with the chosen separator.
Collapse repeated separators down to one.
Trim leading and trailing separators.
Cap to max-length, then re-trim to avoid a dangling separator.
Picking the right separator
Google's URL structure best practices are explicit: "Consider using hyphens (-) in your URLs to make it easier for users and search engines to identify concepts in the URL. We recommend you avoid using underscores (_) in your URLs." Hyphens are treated as word boundaries by the URL parser; underscores join the words together, hiding individual terms from the matcher.
camelCase/PascalCase IDs — pair with "Preserve original case".
Non-Latin scripts and the transliterate switch
Unicode NFD only decomposes characters that have a canonical Latin base. Cyrillic, Chinese, Japanese, Arabic, Hebrew etc. have no base letter to fall back to — they are real letters in their own scripts. So with Transliterate on, those letters are replaced with the separator (because they're outside [a-z0-9]).
Turn Transliterate off to keep them. The allowed-character set becomes \p{L}\p{N} — any Unicode letter or number — so Привет мир becomes привет-мир instead of an empty string. Modern browsers and servers handle Unicode URL paths just fine (RFC 3987 IRIs, percent-encoded under the hood).
Tips and pitfalls
Reserved characters — even with the strictest options on, the slug never contains ?, #, / or % because those are URL-reserved per RFC 3986. Safe to drop into a path segment as-is.
Numbers stay — the slug for "Top 10 in 2026" includes 10 and 2026. That's deliberate; digits are valid URL chars.
Locale sensitivity — the lowercase step uses the browser's default locale, which matters for Turkish (İ → i̇). If you need byte-for-byte deterministic output across machines, run the same algorithm in Node with an explicit locale.
Collision handling — this tool is deterministic only. If two different inputs collapse to the same slug (e.g. "Foo" and "FOO"), your storage layer needs to disambiguate with a suffix.
When to use it vs alternatives
Use this tool for quick text transformation, inspection, decoding, testing, or generation without opening a heavier application. Use a project script or test suite when the same transformation must be repeated automatically.
Privacy and security
Browser-first by design. The tool page explains any exception before you use it.
The text you paste is handled in the browser tab and is not sent to a third-party API by EpitomeTool. Close or refresh the tab when you are done with sensitive snippets.
Frequently asked questions
Does this tool send my text anywhere?
No. The slug is built entirely in your browser. DevTools → Network shows zero requests while you type or paste.
What's a slug, exactly?
A short, URL-safe identifier derived from a longer string. Slugs typically contain only [a-z], [0-9] and a single separator (hyphen most commonly), so they survive being put in a URL, a filename or a database identifier column without escaping.
How does transliteration work?
Two passes. First, a small substitution map handles characters that Unicode NFD doesn't decompose cleanly (German ß → ss, Æ → ae, Polish ł → l, Icelandic þ → th, plus common currency/punctuation symbols like € → eur and & → and). Then NFD normalisation decomposes accented characters into base + combining mark, and the combining marks are stripped.
What happens to Cyrillic, Chinese or Arabic input when transliterate is on?
Those scripts have no canonical ASCII equivalent under NFD decomposition, so the characters get replaced with the separator. If you want to keep non-Latin scripts as-is, turn off Transliterate — letters and digits in any Unicode script are then preserved.
Why is the hyphen the default separator?
Google's URL guidelines explicitly recommend hyphens: "Use hyphens (-) to separate words in your URLs. Don't use underscores (_)." Hyphens are treated as word boundaries by Google's parser, while underscores join words together.
When would I use underscores or dots instead?
Underscores for code identifiers (Python variables, database column names). Dots for hierarchical keys (i18n message paths, Java package fragments). 'Concatenated' (no separator) for camelCase or PascalCase IDs after you flip on 'Preserve original case'.
How is the max-length cap applied?
After all other processing. The slug is sliced to the limit, then if 'Trim' is on, any trailing separator left dangling from the cut is removed. So `"hello-world-foo"` with max-length 11 becomes `"hello-world"`, not `"hello-world-"`.
Are duplicate slugs my problem to handle?
Yes. The tool only does the deterministic transformation — it has no knowledge of what other slugs already exist in your system. If you're slugging blog titles, your CMS should append `-2`, `-3` or a short ID suffix when a collision is detected.
Keep exploring
More tools you'll like
Hand-picked utilities that pair well with the one you're on — all
free, client-side, and zero-signup.