URL Slug Generator from Titles and Text
Turn a title or phrase into a URL slug with the available separator and cleanup options. Review the result before adding it to a route.
URL Slug Generator workspace
Unicode-Aware Transliteration
Café → cafe, Düsseldorf → dusseldorf, Crème Brûlée → creme-brulee. NFD-decomposes accents then strips combining marks. Handles ß, æ, ø, ł, þ, and more.
Full Control
Hyphen, underscore, period, or no separator. Lowercase, preserve case, or uppercase. Optional stop-word removal (a, the, and, …) and max-length cap with word-boundary truncation.
RFC 3986 Compliant
Output is restricted to URL-unreserved characters: A–Z, a–z, 0–9, hyphen, period, underscore, tilde. Validates the result and refuses to leave dangling separators at the edges.
100% Client-Side
Slug generation runs entirely in your browser. Article titles in stealth-launch mode, unreleased product names, and other sensitive copy never reach our servers.
URL Slug Generator: Turn Any Title Into a Clean, SEO-Friendly URL
Turn a title or phrase into a URL slug with the available separator and cleanup options. Review the result before adding it to a route. A slug should describe the page and remain stable once published. Removing accents or stop words can change how a title reads, so review the generated text. Changing an existing URL also requires redirects and internal-link updates; this tool does not perform those changes.
How to use the URL slug generator
- Paste a blog title, product name, or headline into the input — the slug updates instantly.
- Choose a separator: hyphen (default, best for SEO), underscore, period, or none.
- Set the case: lowercase (default), preserve, or uppercase.
- Leave transliteration on so accents become ASCII (
café→cafe), or turn it off to drop non-Latin letters. - Toggle Strip Stop Words and set a Max Length if the slug runs long.
- Copy the result. The status line confirms it passes RFC 3986 validation.
What is a slug, and how slugify works
A slug is the human-readable last segment of a URL. In https://example.com/blog/why-next-js-is-fast, the slug is why-next-js-is-fast. "Slugify" means transforming arbitrary text into that segment: lowercase it, swap spaces for hyphens, remove anything outside a safe character set. The safe set comes from RFC 3986 section 2.3 (unreserved characters): letters A–Z a–z, digits 0–9, and the four marks - . _ ~. Anything else — spaces, &, !, ?, emoji — would need percent-encoding, so a clean slug avoids them entirely.
This tool runs a seven-step pipeline. It NFD-normalizes the input and drops combining marks (so é → e), transliterates letters NFD can't split (ß → ss, æ → ae), applies the chosen case, optionally filters stop words, replaces every remaining non-alphanumeric run with the separator, collapses doubled separators, trims edge separators, then truncates at a word boundary if you set a cap. Use hyphens for content URLs: Google's URL-structure guidance treats hyphens as word separators and underscores as word joiners.
Worked examples: input → slug
Blog title · lowercase · hyphen
10 Things I Wish I'd Known About React Server Components! → 10-things-i-wish-i-d-known-about-react-server-components
Diacritics · transliteration on
Crème Brûlée & Schadenfreude → creme-brulee-schadenfreude
Punctuation · collapsed separators
Why Next.js 16 — A Deep Dive (2026 Edition) → why-next-js-16-a-deep-dive-2026-edition
Edge case · the apostrophe split
Apostrophes are stripped as non-alphanumeric, so contractions split: I'd becomes i-d, not id. Likewise don't → don-t. Search-and-replace the apostrophe out of the title first (I'd → Id) if you want the cleaner form.
Separator and option reference
These are the exact options this tool exposes and what each produces from the title My Blog Post.
| Option | Value | Output | Use for |
|---|---|---|---|
| Hyphen | - | my-blog-post | Content URLs, SEO (Google word-separates) |
| Underscore | _ | my_blog_post | Filenames, variables (parses as one word) |
| Period | . | my.blog.post | Namespaced keys, dotted IDs |
| None | — | myblogpost | Hashtags, handles, compact tokens |
| RFC 3986 set | A–Z a–z 0–9 - . _ ~ | validated, no edge separators | Everything else is removed |
The truncation rule most generators get wrong
When you set a Max Length, this tool does not just chop at the character limit and risk a half-word. It slices to the cap, finds the last separator, and cuts there only if that separator sits past 60% of the limit(lastSep > maxLength * 0.6). If the nearest break is too early — which would throw away most of the slug — it keeps the hard cut instead. So a 30-character cap on building-privacy-first-web-apps yields building-privacy-first-web, not a stub. The validator also enforces isValidSlug: the result must match ^[a-zA-Z0-9._~-]+$ and must not start or end with - . _ ~, so you never ship a dangling-hyphen URL.
Related text & URL tools
Percent-encode the rest of the path & query
Case ConverterAlign slug, file & variable case
UUID GeneratorAppend a discriminator to duplicate slugs
Word CounterPlan title & article length
Find & ReplaceClean apostrophes out before slugifying
Text SorterSort & dedupe a list of slugs
Markdown EditorDraft the post behind the slug
Markdown TOCAnchor slugs for heading links
Lorem Ipsum GeneratorFill the page the slug points to
Guide: Text Tools for CreatorsRead the text-processing workflow guide
Guide: Markdown SyntaxLink headings to slug anchors
All ToolsBrowse the full Toolk hub
Last updated: September 15, 2026 · Runs 100% in your browser — no uploads, tool input is not sent to Toolk.
Frequently asked questions
Why are hyphens recommended over underscores in slugs?
Google's URL-structure guidance treats hyphens as word separators and underscores as word joiners, so seo-friendly-urls reads as three words while seo_friendly_urls reads as one. Hyphen is the default here; underscore, period, and no-separator remain available for filenames, dotted keys, and handles.
Why did my contraction split into two fragments?
Apostrophes count as non-alphanumeric characters, so the pipeline strips them and the surrounding letters separate — I'd becomes i-d rather than id. If you prefer the compact form, remove the apostrophe from the title first (I'd to Id), then regenerate the slug.
Are unpublished titles or product names uploaded while I type?
No. The whole seven-step pipeline — NFD normalization, diacritic stripping, transliteration, casing, stop-word filtering, separator replacement, and RFC 3986 validation — runs locally in your browser tab. Toolk's page analytics never receive the text you slugify.
The slug is deterministic — how do I avoid duplicate URLs for repeated titles?
Same text always yields the same slug by design; uniqueness belongs to your CMS. Append a sequence number or a short random discriminator generated with Toolk's UUID generator (/tools/uuid-generator) whenever two entries collide on identical titles.