Slug Generator

Turn titles into clean URL segments, one at a time or a whole list at once. Accented and non-Latin characters are transliterated rather than deleted, and duplicates in a batch are flagged before your database finds them.

Free · No signup · Runs entirely in your browser

Paste one title per line. Accented and non-Latin characters are transliterated rather than deleted, so München becomes munchen — the naive strip most tools do returns mnchen, losing the letter along with its accent.

3 lines

All unique

Hyphens are the convention Google reads as a space.

0 for no limit. Cuts at a word boundary.

TitleSlug
How to Build a Thing in 2026how-to-build-a-thing-in-2026
München: A Café Guidemunchen-a-cafe-guide
Привет, мир!privet-mir

URL structure is one of those decisions that is cheap now and expensive after launch. Connect GitHub and Tekk turns what you want into specs your coding agent can actually execute against the real repo.

What makes a slug valid

RFC 3986 §2.3 defines the characters a URL can carry without percent-encoding:

unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"

Everything else — spaces, ampersands, question marks, every accented letter — has to be encoded. That is why a space becomes %20 and why café becomes caf%C3%A9, which is technically correct and completely unreadable.

A slug's whole job is to stay inside that set, so no encoding is ever needed.

The transliteration problem

Most tools reduce a title with one regular expression:

text.toLowerCase().replace(/[^a-z0-9]+/g, '-')

It works perfectly for English and quietly destroys everything else:

Input Naive strip What you want
München mnchen munchen
Café caf cafe
Łódź d lodz
Привет (empty) privet

The ü is a single codepoint, so removing non-ASCII removes the letter as well as the accent. Decomposing the string first (Unicode NFD) splits it into a plain u plus a combining diaeresis, and then only the mark is dropped.

That handles accents. It does nothing for Cyrillic or Greek, which need a real character table — and nothing at all for Chinese or Japanese, which need a pronunciation dictionary. This page carries the tables and reports honestly on the scripts it cannot help with.

Letters that do not decompose

A second class of character is not a base plus a mark, but a letter in its own right:

Character Becomes
ß ss
æ ae
ø o
þ th
ł l

Normalisation leaves these untouched, so they need explicit mapping or they vanish along with everything else.

Hyphens, not underscores

Google treats a hyphen as a word separator and an underscore as a word joiner. my_first_post is read as one long token; my-first-post is read as three words. Both are valid characters in a URL — only one of them is parsed the way you intended.

The duplicate problem

This is the failure that actually costs time. Consider a content calendar containing:

  • Getting Started
  • Getting started!

Both produce getting-started. Nothing in either title looks like a conflict, and nothing warns you until a unique constraint fires during an import — usually in bulk, usually at the worst moment.

The batch view above flags the collision at the point you can still rename the post.

How it works

  1. 1

    Paste one title per line

    A single headline or a whole content calendar. Everything outside the characters a URL allows without encoding becomes a word boundary, and the words are rejoined with your separator. Nothing is uploaded — this slug generator runs in your tab.

  2. 2

    Check the transliteration

    Accents are decomposed so the base letter survives: München becomes munchen, not mnchen. Cyrillic and Greek get proper character maps. Scripts with no Latin equivalent, like Chinese or Japanese, are reported as such rather than quietly producing an empty URL.

  3. 3

    Watch for duplicates

    Two titles differing only in punctuation collapse to the same slug — "Getting Started" and "Getting started!" both give getting-started. The batch view marks the collision here, which is considerably cheaper than finding it as a unique-constraint error in production.

Frequently asked questions

What is a URL slug?
The human-readable part of a URL that identifies a specific page — the getting-started in example.com/blog/getting-started. A url slug generator replaces an opaque ID with something a person can read, a search engine can parse, and anyone can paste into a message without it turning into gibberish.
Which characters are safe in a URL?
RFC 3986 defines an unreserved set: letters, digits, hyphen, period, underscore and tilde. Anything else has to be percent-encoded, which is why a space becomes %20. Everything this tool produces stays inside that set, so the slug never needs encoding.
Why do other tools turn München into mnchen?
Because they strip anything outside a–z with a regular expression, and ü is a single character rather than a u with an accent attached. Removing it removes the letter too. Decomposing the string first separates the base letter from the mark, so only the mark goes — which is what a url slug generator has to do to be usable outside English.
Should I use hyphens or underscores?
Hyphens. Google has been explicit for years that it treats a hyphen as a word separator and an underscore as a word joiner, so my_page reads as one token and my-page reads as two. Both are valid in a URL; only one is read the way you meant.
Should I remove stop words from slugs?
Usually not, and the option here is off by default. Removing them shortens the URL and once had a small ranking rationale, but it frequently makes the slug read strangely or ambiguously — how-build-thing rather than how-to-build-a-thing. Clarity for a human reading the link is worth more than the two characters.
How long should a slug be?
Long enough to describe the page and no longer. Three to six words is a reasonable target. The slug generator above truncates at a word boundary rather than mid-word, so a limit never leaves you with a fragment like the-quick-bro.
What is slugify?
The name of the operation — and of a great many library functions that perform it, in every language. To slugify a string is to reduce it to a URL-safe form. This page does the same job without asking you to install anything or paste your titles into someone's server.
Does this handle Cyrillic and Greek?
Yes, through explicit character maps: Привет becomes privet and Ελληνικά becomes ellinika. No amount of Unicode normalisation does that on its own — those alphabets need a transliteration table, which is why most tools that claim to slugify text drop them entirely.
What about Chinese, Japanese or Korean?
Those cannot be transliterated without a pronunciation dictionary, which is far beyond what a page like this should carry. The honest answer is to report that no Latin equivalent exists rather than return an empty slug and let you discover the problem later. For CJK content, a slug in the original script or a manual romanisation is the right call.
Why is there a German umlaut option?
Because German has a real convention that differs from the general rule: ü is conventionally written ue, not u, when the umlaut cannot be used. So München is Muenchen in German usage and munchen everywhere else. Both are defensible, so it is a toggle rather than a decision made for you.
Should I change a slug after publishing?
Only with a 301 redirect from the old URL, and preferably not at all. A changed slug without a redirect drops every existing link and whatever ranking the page had earned. This is why getting the URL right before launch is worth a few minutes with a slug generator rather than a migration later.
Do you store what I paste?
No. The conversion runs entirely in your browser. Nothing is sent to a server, nothing is logged, and there is no account. Disconnect from the internet and it will still work — which matters if you are pasting an unpublished content calendar.
Why is this free, and what is Tekk?
Tekk is a spec-driven development platform for people building software with AI coding agents. This tool costs us nothing to run, and the developers wiring up a routing table are the people we build for. No signup, no run limit, no upsell inside the tool.

Want a real spec for what you’re building?

Drop a sentence. Tekk grounds it in your actual code and turns it into an executable plan.

Free to try · Connect GitHub during signup