Converting case
The Change case mode above - the default when you open this page.
Converting cases as part of a refactor
Renaming identifiers across a codebase is rarely a one-off, it usually happens when adopting a linter rule or moving code between languages. A practical workflow: copy the identifier list out of your linter report (ESLint’s camelcase rule, PEP 8’s invalid-name from pylint), paste the list here one per line, convert, and use your editor’s multi-cursor or a sed script to apply the renames. Converting the names first and reviewing them as plain text catches awkward results, like an acronym that splits badly, before they touch the code.
Edge cases worth knowing
- Numbers stick to the word before them:
user2fa→user_2fain snake_case, keeping the digit grouped with its suffix. - Mixed separators (
hello_world-FooBar) are normalized in one pass; you don’t need to pre-clean the input. - Title Case follows headline conventions: every word is capitalized. For AP-style headlines where short conjunctions stay lowercase, do a manual pass afterwards, automated AP capitalization requires a dictionary of minor words.
- SCREAMING_SNAKE_CASE is just snake_case + UPPER: convert to snake_case first, then apply UPPERCASE if you need constant style.
Where each convention is expected
Beyond per-language norms, casing matters at system boundaries: REST APIs conventionally use snake_case or camelCase JSON keys (pick one and stay consistent), environment variables are SCREAMING_SNAKE_CASE by POSIX convention, CSS custom properties and HTML data attributes must be kebab-case (HTML attribute names are case-insensitive), and database identifiers are safest in snake_case because unquoted identifiers fold to lowercase in PostgreSQL and uppercase in Oracle. Converting at these boundaries, rather than letting two conventions leak into one layer, is what keeps serializers and ORMs configuration-free.
Sorting lines
The Sort lines mode above, or jump straight to it.
More than alphabetical: the sort modes that matter
Sorting a list sounds trivial until you hit version numbers or filenames. The mode you choose changes everything:
| Mode | item2, item10, item1 becomes | Use for |
|---|---|---|
| Alphabetical | item1, item10, item2 | Plain words |
| Natural | item1, item2, item10 | Filenames, versions, anything numbered |
| Numeric | sorts by the number in each line | Pure number lists |
| Length | shortest → longest | Finding outliers, formatting |
| Shuffle | random (Fisher–Yates) | Sampling, randomizing order |
Natural sort is the one people don’t know they need: it reads embedded numbers as numbers, so file2 comes before file10: exactly how Windows Explorer and macOS Finder order files. Plain alphabetical sort puts file10 before file2 because “1” precedes “2” character-by-character.
Why your language’s default sort gets this wrong
The natural-sort mode is worth understanding rather than just clicking, because the failure it fixes shows up in code far more often than in text boxes. Every mainstream language’s default string sort is lexicographic, it compares character by character, and '1' sorts before '2', so file10 lands before file2. Paste those two lines above and switch between Alphabetical and Natural to watch it happen.
In JavaScript the difference is one argument:
['file10', 'file2', 'file1'].sort();
// → ['file1', 'file10', 'file2'] lexicographic
const natural = new Intl.Collator(undefined, { numeric: true }).compare;
['file10', 'file2', 'file1'].sort(natural);
// → ['file1', 'file2', 'file10'] what you meant
Intl.Collator with numeric: true is built into every current browser and into Node, and it is almost always the right default for anything a person will read. The shell equivalents are sort -V and ls -v; Python needs a key function, because sorted() has no numeric-aware mode.
Two edge cases worth knowing before you rely on it. Leading zeros compare equal: file02 and file2 are the same number, so their relative order falls back to whatever the collator decides, do not use natural sort to distinguish them. And numbers are compared, not truncated, so v1.9 correctly precedes v1.10; if you have ever seen a release list put 1.10 before 1.9, that was a lexicographic sort.
Deduplication, done right
Removing duplicates keeps the first occurrence of each line and drops the rest. Two settings change the result in ways that surprise people:
- Case sensitivity: by default
Appleandapplecount as duplicates (case-insensitive). Turn on case-sensitive comparison to treat them as distinct. - Whitespace: a line with a trailing space is not equal to one without, so a “duplicate” may survive. Trim whitespace per line before deduping to catch these invisible mismatches.
The list-to-code workflow
The prefix/suffix/separator trio (see the FAQ) makes this a genuine productivity tool, not just a sorter. Common recipes: wrap a list into quoted JSON array elements, build a SQL IN ('a','b','c') clause from a spreadsheet column, add bullet characters to make a Markdown list, or number lines for a checklist. Because sort and dedupe run first and prefix/suffix apply after, you get clean, deterministic output in one pass.
How big a list can you paste
There is no line limit, because there is no server to impose one, the constraint is your own machine’s memory. Tens of thousands of lines sort without a perceptible pause; at 100,000+ lines you will notice a moment’s work while the collator runs, since natural and case-insensitive sorting compare far more than raw bytes.
Two practical notes for large inputs. Sorting is not done in place: the input field keeps your original order, so a sort you did not want is undone by reading the source column again rather than by re-pasting. And the operations run in a fixed order, trim, then dedupe, then sort, then prefix/suffix, which matters when you are chaining them, because deduplicating before trimming leaves near-duplicates that differ only by a trailing space.
Slugifying titles
The Slugify mode above, or jump straight to it.
What makes a slug work for SEO
A good slug is doing two jobs at once: helping search engines understand the page and making the link clickable for humans. The rules that satisfy both:
| Do | Avoid |
|---|---|
| Lowercase only | Mixed case (causes duplicate-URL issues) |
| Hyphens as separators | Underscores, spaces, %20 |
| Target keywords near the front | Stop-word filler |
| Short, a few meaningful words | 12-word title dumps |
| ASCII (transliterated) | Raw accented/non-Latin characters |
Google explicitly treats hyphens as word separators and underscores as word joiners, so my-blog-post is read as three words while my_blog_post is read as one, always use hyphens.
Transliteration: handling non-English titles
A title like “Düşünce Özgürlüğü” or “Café Crème” can’t go into a URL as-is, raw non-ASCII characters get percent-encoded into unreadable %C3%BC soup. This tool transliterates to the closest ASCII equivalents (Turkish ç→c, ş→s, ı→i; German ü→ue, ß→ss; French é→e) so the slug stays clean and shareable. Scripts with no Latin mapping (Chinese, Arabic, Hindi) get stripped, so for those, transliterate to Pinyin or a Romanized form first before generating the slug.
Stop words: trim, but keep meaning
Removing low-value words (the, a, to, in, for) shortens URLs and sharpens the keyword focus, “The Ultimate Guide to SEO in 2026” becomes ultimate-guide-seo-2026. But blindly stripping them can mangle meaning: “To Be or Not to Be” collapses to a useless be-not-be. Disable stop-word removal for titles where every word matters, quotes, song and book titles, proper nouns. The judgment call is yours; the tool just gives you the toggle.
Duplicates and length
Slug generation is deterministic, so two identical titles produce identical slugs, most CMS platforms auto-append -2, -3 to resolve the clash, but if yours doesn’t, differentiate with a distinguishing keyword (python-tutorial-beginners vs python-tutorial-advanced). And mind length: search results display only ~60–70 characters of a URL, so cap long slugs at a word boundary rather than letting them sprawl. For batch work, bulk mode slugifies a whole list of titles at once.