Case Converter

Max 1 MB · Converts automatically as you type · Multi-line input keeps its line breaks

Every programming language and style guide has its own convention for separating the words inside a multi-word name — and they disagree with each other constantly. JavaScript and Java variables are camelCase. Python variables and functions are snake_case. A class name in almost any language is PascalCase. A URL path or a CSS class is kebab-case. An environment variable or a constant is CONSTANT_CASE. A heading is Title Case. This tool converts freely between all of them (plus plain Sentence case, lowercase, and UPPERCASE), so moving an identifier or a phrase from one convention to another is a paste, not a manual re-typing exercise.

How it works: every conversion goes through the same shared tokenizer first — the actual hard part of this tool, and the one piece that has to be right for every style to be right. It recognizes word boundaries from three sources at once: explicit delimiters already in your text (spaces, hyphens, underscores, dots — any run of them collapses to a single boundary), a camelCase/PascalCase transition (a lowercase letter or digit immediately followed by an uppercase letter), and a run of consecutive capital letters immediately followed by a capitalized word, which is what lets XMLHttpRequest split into XML, Http, and Request rather than X, M, L, Http, Request. Once the words are identified, each of the nine styles is just a different rule for how to case and rejoin them — lowercase and join with nothing for camelCase (after lowercasing the first word only), capitalize every word and join with nothing for PascalCase, lowercase and join with an underscore for snake_case, and so on.

Acronyms get one honest, explicit rule, not a different guess per style: Title Case is the only style that preserves a genuine acronym — parseXMLDocument becomes Parse XML Document. Every other style normalizes it, since XMLHttpRequest-style all-caps runs aren’t a valid convention inside camelCase, snake_case, or any of the others to begin with (parseXMLDocument → camelCase gives parseXmlDocument, not parseXMLDocument). Diacritics are preserved, never strippedÉcole converts to école in lowercase, not ecole — since this tool changes case and delimiters, not the alphabet; if you need ASCII-only output specifically for a URL or filename, Slug Generator is the tool built for that trade-off instead. Multi-line input converts one line at a time, with every line break preserved in the output.

Examples

Frequently asked questions

How does this tool handle acronyms, like XML or IO?
There's one honest, consistently-applied rule rather than a different guess per style: Title Case is the only style that preserves an acronym as-isparseXMLDocument becomes Parse XML Document, not Parse Xml Document. Every other style normalizes it like any other word: the same input becomes parseXmlDocument in camelCase, ParseXmlDocument in PascalCase, parse_xml_document in snake_case. This isn't a limitation so much as a fact about the conventions themselves — XMLHttpRequest-style all-caps acronyms are a prose/display convention, not a rule any real camelCase or snake_case style guide actually follows for identifiers.
Why does this tool keep accented letters (École, café) instead of stripping them, like a slug generator would?
Because this is a case converter, not a URL-safety tool — its whole job is changing letter case and word delimiters, not the alphabet. École converts to école in lowercase and ÉCOLE in UPPERCASE, diacritics intact and correctly cased. If you specifically need ASCII-only output for a URL slug, filename, or similar — where diacritics genuinely need to go — use Slug Generator instead; it strips them on purpose, for a different reason than this tool preserves them.
Is my text sent anywhere?
No. Every conversion runs entirely in your browser with plain string operations — no library, no network request, nothing ever leaves your device.
What counts as a word boundary?
Three kinds, all at once: explicit delimiters already in your text (spaces, hyphens, underscores, dots — any run of these collapses to one boundary), a lowercase letter or digit immediately followed by an uppercase letter (as in helloWorld or base64Encode), and a run of consecutive capital letters followed by a capitalized word (as in XMLHttp splitting into XML and Http). All three combine on the same pass, so a real-world identifier like parseXMLDocument splits into exactly the three words you'd expect: parse, XML, Document.
Does it work on multiple lines, or a whole paragraph, at once?
Yes — paste as many lines as you like and each one converts independently, with line breaks preserved in the output. This is useful for converting a whole list of identifiers (e.g. a column of variable names) in one pass rather than one at a time.